diff options
Diffstat (limited to 'libtdemid/midimapper.h')
-rw-r--r-- | libtdemid/midimapper.h | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/libtdemid/midimapper.h b/libtdemid/midimapper.h new file mode 100644 index 000000000..59fe9f1b5 --- /dev/null +++ b/libtdemid/midimapper.h @@ -0,0 +1,210 @@ +/* midimapper.h - The midi mapper object + This file is part of LibKMid 0.9.5 + Copyright (C) 1997,98,99,2000 Antonio Larrosa Jimenez + LibKMid's homepage : http://www.arrakis.es/~rlarrosa/libtdemid.html + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. + + Send comments and bug fixes to Antonio Larrosa <larrosa@kde.org> + +***************************************************************************/ +#ifndef _MIDIMAPPER_H +#define _MIDIMAPPER_H + +#include <stdio.h> +#include <libtdemid/dattypes.h> +#include <tdelibs_export.h> + +#define KM_NAME_SIZE 30 + +/** + * A Midi Mapper class which defines the way MIDI events are translated + * (or "mapped") to different ones. This way, when two MIDI devices "talk" + * in a somehow different way, they can still communicate. + * + * When the user has an external keyboard that is not compatible with the + * General Midi standard, he can use a MIDI mapper file to play files + * as if the synthesizer was GM compatible. + * + * Please see the KMid documentation + * ( http://www.arrakis.es/~rlarrosa/tdemid.html ) for information on the + * format of a MIDI mapper definition file, and how they work. + * + * I created this class because I had one of those non-GM keyboards, + * so it can do everything I needed it to do for my keyboard to work + * exactly as a GM synth, and a few more things. Currently, it's the most + * featured MIDI mapper available. + * + * The usage of this class is quite simple, just create an object with + * a correct filename in the constructor and then use this object as + * parameter for DeviceManager::setMidiMap(). + * + * @short Midi Mapper + * @version 0.9.5 17/01/2000 + * @author Antonio Larrosa Jimenez <larrosa@kde.org> + */ +class KMID_EXPORT MidiMapper +{ + private: + class MidiMapperPrivate; + MidiMapperPrivate *d; + + /** + * @internal + * Internal definition for Keymaps + */ + struct Keymap + { + char name[KM_NAME_SIZE]; + uchar key[128]; + struct Keymap *next; + }; + + int _ok; + + uchar channelmap[16]; + /** + * @internal + * It's a pointer to the Keymap to use for a channel + * This variable is used to get faster a given Keymap + * The index is the real channel (after mapping it) + */ + Keymap *channelKeymap[16]; + + /** + * @internal + * It's -1 if the channel doesn't have a forced patch, + * else indicates the patch to force in the channel. + */ + int channelPatchForced[16]; + + uchar patchmap[128]; + + /** + * @internal + * Same as channelKeymap + */ + Keymap *patchKeymap[128]; + + /** + * @internal + * Real linked list of keymaps used around the class. + */ + Keymap *keymaps; + + /** + * @internal + * Stores the name of the file from which the map was loaded + */ + char *_filename; + + /** + * @internal + * Simulate expression events with volume events + */ + int mapExpressionToVolumeEvents; + + /** + * @internal + * Map or not the Pitch Bender using pitchBenderRatio() + */ + int mapPitchBender; + + /** + * @internal + * Indicates the ratio between the standard and the synthesizer's pitch + * bender engine. The number sent to the synth is multiplied by this + * and dividied by 4096. Thus if PitchBenderRatio is 4096, the synth's + * pitch bender works as the standard one + */ + int pitchBenderRatio; + + void getValue(char *s,char *v); + void removeSpaces(char *s); + int countWords(char *s); + void getWord(char *t,char *s,int w); + // get from s the word in position w and store it in t + + void deallocateMaps(void); + Keymap *createKeymap(char *name,uchar use_same_note=0,uchar note=0); + void readPatchmap(FILE *fh); + void readKeymap(FILE *fh,char *first_line); + void readChannelmap(FILE *fh); + void readOptions(FILE *fh); + + void addKeymap(Keymap *newkm); + Keymap *keymap(char *n); + + public: + /** + * Constructor. Loads a MIDI Mapper definition from a file. + * @see filename() + */ + MidiMapper(const char *name); + + /** + * Destructor. + */ + ~MidiMapper(); + + /** + * Loads a MIDI Mapper definition file (you don't need to use this if you + * used a correct filename in constructor). + */ + void loadFile(const char *name); + + /** + * Returns the status of the object. + */ + int ok(void) { return _ok; } + + /** + * Returns the channel which chn should be mapped to. + */ + uchar channel(uchar chn) { return channelmap[chn];} + + /** + * Returns the patch which pgm used on channel chn should be mapped to. + */ + uchar patch(uchar chn,uchar pgm); + + /** + * Returns the key that key note playing a pgm patch on channel chn should + * be mapped to. + */ + uchar key(uchar chn,uchar pgm, uchar note); + + /** + * Returns the value which the pitch bender on channel chn should be + * mapped to. + */ + void pitchBender(uchar chn,uchar &lsb,uchar &msb); + + /** + * Returns the value which a given controller and its value should + * be mapped to when played on channel chn. + */ + void controller(uchar chn,uchar &ctl,uchar &v); + + /** + * Returns the path and name of the file which the object loaded the + * mapper from. + */ + const char *filename(void); + +}; + +#endif |