After many people asking me for a solution to map notes in a different order (MidiMapper), I have developed an application over the last two years that should bring help for most of the mapping problems people in the MMD might have. In a nutshell, what it does is
-- mapping notes different for each of the 16 MIDI channels so that any organ or piano roll converted to MIDI file can be played with the correct notes on a sound module;
-- give you limited ways to make register notes send patches (Program Changes) so that the sound in the sound module changes according the rank of pipes that is playing;
-- allow you to shift notes forward in time (up to 1 second) to allow for time compensation. This is handy to offset drum notes or if you want a sound module to play in perfect time with a real instrument that suffers from time delays, like the Yamaha Disklavier, etc.;
-- send the incoming MIDI back out over maximum 4 output devices.
It is designed for and tested on Win98/Millennium/XP and it seems to work without any problems. Win95 should also work, but I don't have a PC to test this.
If the interest for this MidiMapper is big enough, the idea is to update the mapper so that you can basically re-create the sound of any existing mechanical instrument within this mapper. This would allow people to hear the MIDI files on the PC as a realistic representation of the real instrument.
The free evaluation version allows you to test all functions, but it shuts down after 15 minutes after which you can re-open it unlimited times. The full version costs 50 euro or 50 US$. As this money is intended to cover made expenses and part of the large amount of invested time, and not really for profit, I will see how far this money will allow me to give free updates in the future.
But the MidiMapper is fairly complete as it is. The only major update will be that the MidiMapper will create ghost parts to allow for multiple ranks of pipes playing together in the sound module.
All needed explanation to make it work is available in the "Installation.txt".
30 Mar 2003 16:37:11 +0200
Zip file decap_MidiMapper.zip (1,051 kb) contains
Installation.txt (reproduced below)
Download decap_MidiMapper.zip (1,051 kb)
Installation.txt 30 March 2003
Steps to install the DecapMidiMapper correctly.
Step 1) -- The first step is the installation of the MidiYoke. This is an internal port driver to connect MIDI applications internally to each other. The idea is that you use a program like Cakewalk (or any other MIDI playing program) to play the MIDI file. But you don't send the MIDI straight to your sound card, but to the MidiMapper. This application sends the MIDI, after transforming it accordingly by the mapper, to the sound card.
So the MIDI stream is as follows: Music program MIDI out = MidiYoke1, MidiMapper input is MidiYoke1, MidiMapper output(s) are up to 4 sound cards or MIDI devices of your choice.
To download and install the MidiYoke go to the MidiYoke site:
It includes all information you need. If you are successful, you
should see the MidiYoke ports added on your PC. You can check this
in. for example. Cakewalk under MIDI devices.
Step 2) -- Create a directory of your choice in which you can copy all the needed files (for example, just "MidiMapper"). Copy the files "DecapTimerSetup.exe", "MapCreator.exe", "DemoMidiMapper.exe" (and also the registered MidiMapper version if you have it) and this text file to that directory.
Put the included set-up program in a directory of your choice (for example
Timer or DecapTimer), and run it.
Maak een map aan waar je de MidiMapper naartoe wil kopieren. De naam mag je zelf kiezen, Bv. "MidiMapper" (hmm, erg origineel... ;-). Kopieer er dan de bestanden "DecapTimerSetup.exe", "MapCreator.exe" en "DemoMidiMapper.exe" (en/of ook de geregistreerde MidiMapper) naartoe.
Step 3) -- Install the DecapTimer (DecapTimerSetup.exe). This is the
high resolution timer the application needs for the delays with millisecond
resolution. Just double click and follow the setup instructions.
Step 4) -- Start the application you want to work with (MapCreator or MidiMapper or both).
The MapCreator is used to create the mappers (conversion-lists) and to save them. This application creates a subdirectory called Mappers, and this is best used to store al mappers you create, so that you can easily find them when you want to load the mapper in the MidiMapper application. MapCreator has no copy protection (like the MidiMapper Demo), and can be freely distributed.
Some more explanation:
-- "From" column (not changeable) is the source note.
-- So the first column that you can change (To) represents the destination note.
-- 2nd (Chan) is the channel this note is supposed to go to
-- 3rd (Port) is the output port of the note. There are 4 output ports available. What these ports actually stand for depends on the output devices you selected in the MidiMapper program.
-- 4th (Vel%) is the velocity percentage. For example 100 means not changed, 50% means half the velocity, 200 means double the velocity (with a value of 127 as highest possible).
-- 5th (+MS) is the MilliSecond delay, or the time the note is supposed to wait before it goes out.
-- 6th (Patch) is a patch (or program change) that the source note can force to send. So for example if the source note is the register JazzFlute, you can set the destination note to -1 (no note is send), set the channel and port the same as the melody note's, and set the Patch to 76, so that the PanFlute patch on the GM soundmodule is selected when the JazzFlute note is detected.
-- 7th (Ctrl#) Is the Control Number that the source not can force to send. ControlNumber 7 is the volume, so following the same strategy as the patch, you could send a volume change that put the PanFlute properly in the mix.
-- 8th (CtrVal) is the ControlValue, so in our example the actual volume of the PanFlute.
An example of a register note is the following.
Say that note 20 is the registernote for the JazzFlute, then you set:
From=20 (you can not change this. It just is line # 20).
To= -1 (-1 meaning you don't send the note)
Chan= 5 (if you also mapped the melody to channel on 5)
Port= 1 (if you also have set the melody on port one)
Vel%= 100 (you do not use the velocity any way, as you have set "To" to -1)
+MS= 0 (or you could use this to slide the patch forward in time)
Patch= 76 (this is GM PanFlute)
Ctrl= 7 (select the volume as the controller you want to send)
CtrVal= 89 (set the volume to 89)
So now, when the JazzFlute note is detected, the note is not send, but a PanFlute patch is send on Channel 5 trough Port 1 and the volume is set to 89.
One more note I want to make is that for compatibility's sake (if we want to exchange mappers later on) we should try to follow some guidelines.
So the first guideline I like to propose is that the destination channels are as follows:
Bass = Channel 2
Accomp = Channel 3
Counter Melody = Channel 4
Melody = Channel 5
Drums = Channel 10
The included MidiMapper is the Demo-version. This version is limited to 15 minutes of use, after which you have to restart the app again (unlimited times).
This demo generates a PC-ID number that you need to send if you want to upgrade to a registered version (price 50 EURO). Use the Copy to Clipboard function included in the Help to prevent typing errors.
The MidiMapper application allows you to open the mappers created with the MapCreator. To use this program, you must open a mapper, select the proper midi devices and you should be ready to go. An example of how to set the devices: Cakewalk-out: MidiYoke1, MidiMapper in: MidiYoke1, MidiMapper-out: your soundcard).
The PC-ID number protection may cause some dismay for which we apologize. But designing a stable application is not so easy. Then the program is so easily past on between friends for "old time's sake", that it will become impossible to support the program in the future.
Good luck with de installation of the MidiMapper!
There are things that the MidiMapper can do, and there are things it
can not do.
What this MidiMapper does is:
-- Map "each incoming note" of "each of the 16 midi channels" different according the 16 map's, one for each channel.
-- Provide timing offset to slide notes in time.
-- Allow notes to send patches and controllers.
What this MidiMapper does not (yet) do:
-- Duplicate the parts multiple times according to the amount of ranks of pipes playing.
Now that last part is a problem. You can understand that, according
to changes in the registration of the organ, the soundcard should change
to sounds that represents the rank of pipes playing. So when a rank of
trumpet plays, a trumpet sound should be selected on the soundcard, and
when a rank of violins play, you could select for example strings to substitute
for the violins of the organ.
But what happens if both the trumpet AND the violins play at the same time??
This is a problem for midi. The reason is that midi is not set-up to work that way. Midi is designed to have a certain instrument play on a certain midi channel, that's it. If you want two instruments to play at the same time, you must duplicate that part to two track's each playing at a different channel with a different sound.
The organs we know for so long are designed with a completely different approach. Here the problem was that there was only a limited amount of keys in a keyframe (a limitation midi does not have), so the idea appeared to have the same key play multiple ranks of pipes and a scheme of registrations would decide what ranks these were going to be.
So here I am to find a solution that combines this two worlds.
The only solution to the problem is to create ghost parts that play on different channels. But as you can imagine, this is going to make the MidiMapper a lot more complex, which in turn is not going to make things easier to understand for the user of the MidiMapper.
But I do have a solution in the making that should be transparent enough to understand.
As it is now, the last patch send will be the one played. So going back to our previous example, it is going to be OR the trumpet, OR the strings playing the part, but not both sounds together.
You then have to select a sound (and if you want a volume adjustment
you also have to set the controller) that will substitute for the rank
of pipes it represents. But when two or more ranks are playing at the same
time, the last send patch will be the one you hear.
You can do limited selection of the sound you want to hear by shifting the time of the register note that sends the patch. With this I mean to say that, if you set the +MS of the trumpet register to 50, this patch will be send 50 milliseconds later. So if the trumpet and the strings are taken at the same time, the trumpet patch will be send a little later, so this will be the sound you get on the melody.
The next update will create ghost parts for the sounds that currently are not played.