MMD > Archives > March 1996 > 1996.03.24 > 06Prev  Next


Re: Useful MIDI Utilities
By George Bogatko

At 11:56 AM 3/24/96 PST, you wrote:

>  Subject: Useful MIDI Utilities

I'm cranking on one to allow me to compose new O rolls using many "piano
roll views" on Cakewalk and compress all those views into two "channels".
The idea is to preview the arrangement using GS MIDI ( with the orchestral
drum kit ) and then map all the notes into O roll format.   It uses a
library of utilities I found on the net..

To specify the mapping you create a map description file.  Each line has
this format:¶
        <input channel>, <input note>, <output channel>, <output note>

The first hack takes an example file that came with the library, that
converts a MIDI 1 file and converts it into a MIDI 0 file.  I've modified it
to do this mapping during the conversion.  I still have to study the MIDI
spec and the examples, and will then be able to filter a MIDI 1 file into a
mapped MIDI 1 file, but for now, the results are very usable.   One could,
for instance, compose a tune destined for a Wurlitzer 150, and then map it
into a MIDI file that would have all the "missing" notes mapped out.

Here is the map I'm using currently in my experiments.

file: "oroll.map"¶
***************************

•#OROLL.MAP
#Assumes piano is  on channel 1
#        xylo  is  on channel 2 - suppressed during conversion
c=2, suppress
••
#        pipes are on channel 3 - suppressed during conversion
c=3, suppress
••
#        percussion on channel 10 - assumes GS MIDI Orchestral percussion set
#        controls on channel 4
••
#Normal Chromatic scale e3 to a61 (notes 20-61)
c=1, i=e3, c=2, o=e3
c=1, i=f3, c=2, o=f3
c=1, i=f#3, c=2, o=f#3
c=1, i=g3, c=2, o=g3
c=1, i=g#3, c=2, o=g#3
c=1, i=a3, c=2, o=a3
c=1, i=a#3, c=2, o=a#3
c=1, i=b3, c=2, o=b3
••
c=1, i=c4, c=2, o=c4
c=1, i=c#4, c=2, o=c#4
c=1, i=d4, c=2, o=d4
c=1, i=d#4, c=2, o=d#4
c=1, i=e4, c=2, o=e4
c=1, i=f4, c=2, o=f4
c=1, i=f#4, c=2, o=f#4
c=1, i=g4, c=2, o=g4
c=1, i=g#4, c=2, o=g#4
c=1, i=a4, c=2, o=a4
c=1, i=a#4, c=2, o=a#4
c=1, i=b4, c=2, o=b4
••
c=1, i=c5, c=2, o=c5
c=1, i=c#5, c=2, o=c#5
c=1, i=d5, c=2, o=d5
c=1, i=d#5, c=2, o=d#5
c=1, i=e5, c=2, o=e5
c=1, i=f5, c=2, o=f5
••
#SPLIT MIDI CHANNEL HERE AT PIANO MIDDLE C (assume two devtronix devices)
••
c=1, i=f#5, c=1, o=f#5
c=1, i=g5, c=1, o=g5
c=1, i=g#5, c=1, o=g#5
c=1, i=a5, c=1, o=a5
c=1, i=a#5, c=1, o=a#5
c=1, i=b5, c=1, o=b5
••
c=1, i=c6, c=1, o=c6
c=1, i=c#6, c=1, o=c#6
c=1, i=d6, c=1, o=d6
c=1, i=d#6, c=1, o=d#6
c=1, i=e6, c=1, o=e6
c=1, i=f6, c=1, o=f6
c=1, i=f#6, c=1, o=f#6
c=1, i=g6, c=1, o=g6
c=1, i=g#6, c=1, o=g#6
c=1, i=a6, c=1, o=a6
••
#SOLO chromatic scale a#6 to a8
c=1, i=a#6, c=1, o=a#6
c=1, i=b6, c=1, o=b6
••
c=1, i=c7, c=1, o=c7
c=1, i=c#7, c=1, o=c#7
c=1, i=d7, c=1, o=d7
c=1, i=d#7, c=1, o=d#7
c=1, i=e7, c=1, o=e7
c=1, i=f7, c=1, o=f7
c=1, i=f#7, c=1, o=f#7
c=1, i=g7, c=1, o=g7
c=1, i=g#7, c=1, o=g#7
c=1, i=a7, c=1, o=a7
c=1, i=a#7, c=1, o=a#7
c=1, i=b7, c=1, o=b7
••
c=1, i=c8, c=1, o=c8
c=1, i=c#8, c=1, o=c#8
c=1, i=d8, c=1, o=d8
c=1, i=d#8, c=1, o=d#8
c=1, i=e8, c=1, o=e8
c=1, i=f8, c=1, o=f8
c=1, i=f#8, c=1, o=f#8
c=1, i=g8, c=1, o=g8
c=1, i=g#8, c=1, o=g#8
c=1, i=a8, c=1, o=a8
c=1, i=a#8, c=1, o=a#8
c=1, i=b8, c=1, o=b8
••
# Percussion mapping - GS MIDI patch 48 (orchestra drum set)
# 1. timpani - MIDI 36
c=10, i=36, c=2, o=21
••
# 2. Bass drum and tap cymbal - MIDI 59 (cymbal only)
c=10, i=59, c=2, o=22
••
# 3. timpani - MIDI 87
c=10, i=87, c=2, o=23
••
# 4. wood block - MIDI 62
c=10, i=62, c=2, o=24
••
# 5. snare drum tap - MIDI 38
c=10, i=38, c=2, o=25
••
# 6. snare drum roll - MIDI 40 (but you have to reiterate yourself)
c=10, i=40, c=2, o=26
••
# 7. triangle - MIDI 34
c=10, i=34, c=2, o=27
••
# 86. tambourine - MIDI 54
c=10, i=54, c=1, o=106
••
# 88. crash cymbal - MIDI 57
c=10, i=57, c=1, o=108
••
# CONTROLS
# 50 - forward to play
c=4, i=50, c=2, o=20
••
# 51 - piano sustain
c=4, i=51, c=2, o=28
••
# 52 - piano soft pedal on
c=4, i=52, c=2, o=30
••
# 53 - piano soft off
c=4, i=53, c=2, o=29
••
# 54 - mandolin on
c=4, i=54, c=2, o=32
••
# 55 - mandolin off
c=4, i=55, c=2, o=31
••
# 56 - pipes on
c=4, i=56, c=2, o=33
••
# 57 - pipes off
c=4, i=57, c=2, o=39
••
# 58 - drum expression on (soft)
c=4, i=58, c=2, o=35
••
# 59 - drum expression off (loud)
c=4, i=59, c=2, o=36
••
# 60 - xylophone on
c=4, i=60, c=2, o=34
••
# 61 - xylophone off
c=4, i=61, c=2, o=37
••
# 62 - crescendo
c=4, i=62, c=1, o=87
••
# 63 - shut off
c=4, i=63, c=2, o=38
••
# 64 - rewind
c=4, i=64, c=1, o=89

•************************

If you don't map the note, you don't get it in the output.

I'm still playing with speeding it up.  It uses linked lists for storage,
which grinds to a slow crawl rather quickly.   A btree approach will speed
things up.

The other major drawback is that it currently only successfully compiles
with the GNU C/C++ compiler for DOS.   I do *no* work on DOS or Windows (my
major money making job is on UNIX systems), so have never bought the MS C++
compiler.  The GNU compiler has the advantage of being incredibly cheap.
You can find it on the "Source Code" disk from InfoMagic (info@infomagic.com)
which costs $20.  A complete C/C++ environment which purports to contain
hooks into windows.

JODY:  If this is interesting, when I get the b-tree version going I can upload
the source and a GNU binary (it runs under DOS, but needs some supporting
executables) to wherever you want.  Just let me know where to store it.  I
can also put it on my web page.   Everything is covered under the GNU
license.  If anybody is *really* interested, drop me a line and I'll
post/send the current hack now.

GB¶
*************************************************¶
George Bogatko - gbogatko@intac.com
                 http://www.intac.com/~gbogatko

 [ George,
 [ All of my MIDI programs use a sorted linked list with an array of
 [ "hints" to help find the insertion point.  A B-Tree would probably
 [ be more general (its easy to exceed the size of the hint array).
 [ Unfortunately I found that its easy to end up with more data structure
 [ "overhead" than actual data, and running under DOS thats a disaster.
 [ Perhaps paging portions of the tree out to disk might help.
 [
 [ There's quite a few subscribers that would be interested in seeing
 [ your code.  I'd be happy to put any source you want to upload into
 [ the .../misc subdirectory in the FTP archive on foxtail.  I assume
 [ you intend to let people do what they want with this ?
 [
 [    Being permanently connected to the Internet at 56Kb allows me to
 [ download all kinds of goodies pretty quickly, so I've only bought a
 [ few CDs containing "free" software.  I did buy the entire GNU archive
 [ a while back, though.  The GNU stuff works really well with all of
 [ the Unix clones (BSDI, Free BSD, and Linux).  I really like that
 [ you get the source code and are encourage to embellish on the programs
 [ if you want to.  Linux has become quite popular amongst the hobby crowd
 [ and is also distributed under a "GNU Style" license (sometimes referred
 [ to as a "copyleft").  Linus is available on CD (there are several vendors)
 [ and is cheaper than the floppies that it would take to hold all the source.
 [ Linux had sound card and MIDI card drivers, supports X Windows and
 [ 32 bit virtual addressing.  I can process the largest MIDI files
 [ imaginable on Linux running on a 386 with 8 Meg of Ram.  Of course,
 [ I'm now running BSDI on a Pentium with 32 meg, but thats another story.
 [
 [ For my "commercial" MIDI products that run under DOS on the PC, I use
 [ Borland C++ 3.5 with its Integrated Development Environment.  I still
 [ prefer the Unix "vi" editor, but the Borland IDE does a nice job of
 [ integrating the Editor, Compiler, and Debugger in a way that is a lot
 [ less mysterious than using the Unix equivalent.
 [
 [ Jody

(Message sent Sun, 24 Mar 1996 16:51:44 -0500 , from time zone -0500.)

Key Words in Subject:  MIDI, Useful, Utilities