------------------------------------- ## Impulse Tracker MIDI Supplement ## ------------------------------------- Introduction ============ The biggest new addition to Impulse Tracker 2.12 has been support for sending data out through the MIDI protocol. Earlier versions of Impulse Tracker (IT) have had support for incoming MIDI data, so it was possible to play on a 'MIDIfied' keyboard and have IT 'track' all the notes down in the pattern in realtime. MIDI out, however, is a completely different ballgame. You in fact don't have to read this supplement at all if you wish to get MIDI working, but in order to gain full usage of MIDI out, you will have to read this in order to understand how IT's MIDI support fully works MIDI Support & Soundcards (Modified by Pulse) ============================================= At present, the only sound devices IT supports for MIDI output are the AMD InterWave and the Creative Labs Sound Blaster AWE32. Support for other soundcards is via the generic MPU401 driver. To use this driver, you must run "IT /S19 /A
" where
is the address of your MPU401 compatible card (eg. "IT /S19 /A330"). Note that the generic MPU401 driver does *NOT* support sample playback at all. MIDI And AWE32 Soundcards (Pulse) --------------------------------- I have found that the Windows '95 drivers for the AWE32 are somewhat buggy. On my computer, I can use MIDI In/Out in Impulse Tracker *IF* I disable the MIDI support within Windows '95. Otherwise, it is simply not recognised. To disable the MIDI support in Windows '95, right click on "My Computer", "Properties", "Device Configuration", "Sound, Video & Game Controllers". Double click on "Creative Labs SB16 or AWE32" and go to the resources. Uncheck the "Use Automatic Settings" box if it is set and change the basic configuration to one that does NOT include the MIDI Ports 300h or 330h. (For example, Basic Configuration 0 has only 220h, 5, 1, 5 on my computer and IT works fine in a DOS Box) Enabling MIDI ============= To enable MIDI output, you must first have IT on Instrument control mode rather than Sample control mode. To do this, press F12 to go to the Song Variables screen and switch control to 'Instruments' if you haven't already done so. MIDI & Instruments ================== MIDI Channel ------------ New to the Pitch section of the Instrument screen (press F4 and select the "Pitch" button) are the sliders "MIDI Channel", "MIDI Program" and "MIDI Bank". Once the MIDI Channel value for that instrument is set to a value other than zero, IT will send out MIDI data whenever that instrument is encountered in a pattern, on that particular MIDI Channel. What data IT actually sends through the MIDI port will be a note on command, although this will be discussed in more detail later. MIDI Program/MIDI Bank ---------------------- The MIDI Program and MIDI Bank sliders work in a similar manner to each other. If they have a value set to -1, IT will not transmit a program change message nor a bank change message for that instrument. If you specifically set a MIDI Program for that instrument, IT will send a 'program change' message along with the 'note on' message. The MIDI Bank instrument setting is also the same; IT will not send a bank change message if the MIDI Bank slider is set to Off (ie: has a value of -01). If the MIDI Bank setting is active for that instrument, IT will send it along with the note on message as well. Summary ------- IT will always send a 'note on' command for a particular MIDI channel whenever a MIDI instrument is encountered in the pattern. (A MIDI instrument is simply an instrument where the MIDI Channel value has been set to something other than "Off"). IT will also send a program change command and/or a bank change command along with the note on command if they are set active. More Advanced MIDI ================== How MIDI Works -------------- MIDI is not a file format (like IT is a module format) nor is it even a file layout. MIDI is a computer protocol (or language) which is used to communicate between devices . You may like to think of it as a network, where the MIDI cables are the cables you lay between computers, and MIDI is the network protocol (such as Novell NetWare, Windows Networking or TCP/IP) used to communicate between the sound devices. When an instrument is said to be 'MIDI compliant', that means that it has support for the MIDI protocol and understands MIDI messages. The .MID file format is simply a way to store these messages. It is a collection of MIDI data, and when a .MID file is run through a MIDI player, all the MIDI player does is send the data in the .MID file out through the computer's MIDI port. In a network analogy, if you can imagine that every single transaction run through the network was being logged to a file on your hard disk; that every single byte was being recorded to a logfile, this is what a .MID file is. An example of MIDI Communication in IT -------------------------------------- You've read above that when IT encounters a MIDI instrument in the patterndata, it sends a 'note on' command, which is defined in the MIDI protocol to be 'Play this note on this MIDI channel at this particular velocity'. (Velocity is similar to volume ). If you play a MIDI instrument which is mapped to MIDI channel 2 at C-5 with a velocity of 64, the actual data which IT sends out to the MIDI port resembles something like this (in hex): Note On with parameters; MIDI Channel: 2 Note: C-5 Velocity: 64 Data that IT sends out (hex): 91 3C 40 Data that IT sends out (decimal): 145 60 64 We'll run through each of these three bytes step by step. The first byte (91 in hex, or 91h) is the actual 'Note on' command. It tells the receiving MIDI device that the data which follows is part of the 'note on' data. An analogy which trackers may find useful is the effect column. There, you have an effect command and effect data; for example, the effect 'G20' can be split up into two parts--'G' and '20'. The 'G' part is the actual effect command which tells IT that you wish to perform a portamento, and the '20' part is the effect data, or in this case the spe ed at which the portamento should occur. In this MIDI example, the '9' is the MIDI command and the '1 3C 40' is the rest of the data for that command. Now, the second digit (1 in our example) specifies the MIDI channel. MIDI channels are 0-based; that is, if you want to send to MIDI channel 6, IT specifies 05 for the actual data. MIDI channel 10 is 09h, MIDI channel 14 is 0Dh, etc. Here we're sending to MIDI channel 2, so the value sent out over MIDI is 01h. The second byte (3Ch) is actually the note to send (C-5 here). In MIDI, all command (parameter) data is between a scale of 00h-7Fh (or 0-127 in decimal). Notes are transmitted the same way - via numbers. If you imagine C-1 is sent with a value of 00h, C#1 i s 01h, D-2 is 02h, etc, then the note we want to play, C-5, has a value of 3Ch (60 decimal). Now the first and second bytes are done with, the third byte should be fairly easy to understand. This byte represents the velocity at which the note should be played. In our case, we want a velocity of 64, which translates to 40h, and so this is the value which is sent out. So to recap, we have three bytes for the note on command, "91 3C 40". Byte 1: 91 == Note on command (on MIDI channel #2) Byte 2: 3C == Note on data (Note to play, C-5) Byte 3: 40 == Note on data (Velocity of 64 decimal) Configuring IT's MIDI out data ------------------------------ Keeping the above example in mind, press Shift-F1 to get to IT's MIDI screen and press the 'MIDI Output Configuration' button. This will take you to IT's MIDI out engine. Now, if you examine the 'Note On' field, it reads: 9c n v This can be correlated to our above example of '91 3C 40'. Now, the 'c n v' in the Note On field corresponds to 'channel', 'note' and 'velocity'. Think of them as variables; IT will substitute the appropriate channel, note and velocity values which it encounters in the MIDI instrument information and/or patterndata. If you now actually defined a MIDI instrument to play on MIDI channel 2, and you played it in a pattern at C-5 with velocity 64, all IT does is read the 'Note On' field from the MIDI configuration screen and substitute '1' for 'c', '3C' (C-5) for 'n' and '64' for 'v'. Therefore, IT will read '9c n v' and replace it with '91 3C 40'. In any of the MIDI output fields, lowercase letters represent variables (or subsitutions which IT should make) and uppercase letters or numbers are constants which IT writes to the MIDI port directly without any change. Therefore, these fields are case se nsitive--for the note on command, '9c n v' is blatantly different to '9C n v'. 9c represents 'send byte 09 followed by the MIDI channel byte', whereas 9C represents 'send the byte 9C'. In short, 0-9 and A-F are treated as hexadecimal constants and will be passed through directly. Lowercase letters will be treated as variables and substituted accordingly. Note that variables are regarded as 'full bytes' by themselves and are never part of an actual byte sequence except for the variable 'c', so '9n' is exactly the same as '09 n' or '9 n'; all of them will expand to the sequence '09 '. 'c' is the only value that takes on a nibble (4-byte) value, due to the MIDI protocol definition. This means that 9c will actually become one byte when expanded, with the lower digit representing the channel. IT MIDI Variables ----------------- c: MIDI channel This is simply the MIDI channel of which the instrument is set to, 0-based. Note that this is the only nibble sized variable. n: note value A value from 00-7Fh representing the note to be played, where C-5 is 60h. v: velocity The MIDI velocity of the note. u: volume Volume is similar to velocity, except that velocity does not take the volume envelope and fadeout values into account, whereas the 'u' volume variable does. x: pan set Sends a MIDI panning value. This does not take into account panning envelopes. y: calculated pan Sends a MIDI panning value which does take into account panning envelopes. a: high byte of bank select b: low byte of bank select These commands are only really useful in the bank change field. z: macro data (See section on macros for full explanation). Configuring MIDI Output for Your Keyboard ----------------------------------------- In the basic IT distribution, the only fields which have any data are 'Note on', 'Note Off' and 'Program Change'. The reason for this is that these are the only commands which are set as standards by MIDI. MIDI commands such as Change Pan, Bank Select , e tc all differ from synth to synth. There's not much which can be done to solve this, you will have to look up your synth's manual to find out the exact MIDI commands it needs to issue a panning change, bank select, etc. Some values which you may wish to try, however, will be: Change pan: Bc 0A x Bank select: Bc 0 a 20 b These may or may not work. If they do, then great, but if they don't, you will have to actually RTFM *gasp* in order to get these other commands working. Effect Commands & Macros ======================== Now that IT's MIDI engine is understood and the basis of MIDI communication has been laid down, perhaps the most powerful function of IT's MIDI engine, macros, will be explained. Standard Effects ---------------- Firstly, at the moment there is NO support for standard IT effect commands (such as pitch slide, portamento, vibrato etc) to work via MIDI. This may or may not be implemented in future. Currently, however, if you perform an E01 effect on a note, nothing w ill happen as far as the MIDI aspect of the instrument is concerned. Macro Effects - SFx ------------------- The SFx command, previously used in the .MOD format as "FunkRepeat", has been changed in IT to allow for the functioning of MIDI macros. The unused Zxx command will also now play a part in MIDI functioning. To understand how this works, it's best to take an example into account. At the beginning of this supplement, the MIDI sequence '91 3C 40' was used which was a Note On, MIDI channel #2 played at C-5 with a velocity of 64. This was represented in IT's MIDI configuration as '9c n v', so it made the appropriate substitutions to '91 3C 40'. The Macro Setup section of IT's MIDI Output Configuration screen can be used to define your own custom MIDI command/data sequences. These can be absolutely anything you like, from a MIDI SysEx command to a Note On command. In fact, to start off, we'll tak e a Note On sequence as an example and we will attempt to emulate the same '91 3C 40' bytes, except that we'll make this sequence ourselves rather than letting IT do the work for us. How SFx and Zxx commands relate ------------------------------- Firstly, remember that IT substitutes values when it encounters variables. If you glance at the above section on IT MIDI Variables, you'll notice that the 'z' variable represents macro data. Now that this '91 3C 40' sequence has been driven into our he ads, try setting the SF0 macro field on IT's MIDI Output Configuration screen to '91 3C z'. Remember that the third byte in the MIDI sequence (40 in our normal example) is the velocity to send with the Note On message. The SF0 macro field you've just defined means that IT will read any Zxx effects and replace the 'z' variable in the SF0 macro with the 'xx' value from the Zxx effect. To enable the macro, simply put in a SF0 along with a Note On in the pattern data. Now, all values from Z00 to Z7F will substitute for 'z' accordingly. So, to show that our SF0 sequence will reproduce the exact same thing as our Note On command: C-5 01 SF0 (this will play the note on command as usual, and specify that the SF0 macro sequence should be hooked to Zxx effects). ... .. ... ... .. ... ... .. ... ... .. Z40 (this will trigger our SF0 sequence with a 'z' value of 40h). The above patterndata should produce a note on event at row 0 in the pattern, and again at row 4. Now, try replacing the Z40 effect with Z7F and IT will substitute 'z' with '7F', or a velocity of 7Fh (127 decimal) in our SF0 sequence. The result should be that you'll hear a Note On with velocity 64 on row 0, and a Note On with velocity 127 on row 4; ie: the second note triggered will be twice as loud. The The sequence that IT will send will be '91 3C 7F'. SFx commands summary -------------------- Our example above of using a 'note on' command sequence for an SFx effect is rather pointless, since IT does this effect itself. However, it has hopefully served its purpose by demonstrating how effects work. The SFx commands, as you can see, can be redefined to absolutely any MIDI data at all. This can be something simple like a pitch slide, a complex SysEx 'set filter to aftertouch' command, or whatever you like. The possibilities are endless and are only li mited by what your synth can do; IT's SFx/Zxx combination is customisable enough to handle nearly any MIDI data you wish to output. If you wish to take advantage of these commands, you will have to look up the manual for your synth and get stuck into the MIDI/SysEx section. Please do not come to any IT support people asking for help on this subject because every synth is different. Z80 -> ZFF commands ------------------- The Z80 to ZFF commands are also macro sequences, but they have no 'z' variable to substitute for. They are not 'hooked' to any SFx effects, they are straight, direct macro sequences. For example, if you have a MIDI controllable effects unit (such as an Alesis MidiVerb), you may wish to assign the Z80 command to set a up a certain value for the reverb delay length. Later in the song, you can issue a Z81 command to change the reverb delay or turn it off altogether. To summarise, the Z80 to ZFF commands are similar to SFx macro sequences, but they do not have any extra parameters (whereas the SFx macro's 'z' variables are controlled by Z00 to Z7F). Contact Information =================== If there are any problems with this textfile, email ozone@post1.com or pulse@cyburbia.net.au __/\___/\_/\____/\____/\ .. . Andre Pang % vault ...: / /__ / \_ \_ __) :.. mailto:ozone@post1.com . ....: ( : / (__: ) | | _)_ : . http://www.mindflux.com.au/ .: \___( ______/|__;__|_____| :. irc: #trax (irc.neato.org) ..: \/ - #ozone