AOH :: IBM-MIDI.TXT

IBM MIDI interface guide


                       IBM MIDI INTERFACE
                          Version 1.0
                        Harley A. Burton

                         Copyright 1987
                          Burtech Ind.

GENERAL

The  Musical  Instrument Digital Interface (MIDI) worked out  by 
Casio, Roland, and others a few years ago has be come the widely 
accepted  standard  of  the  musical  industry  for  interfacing 
everything from keyboard synthesizers, tape recorders, mixers to 
drum  machines and everything else conceivable.   The impact  of 
this  technology  on  the  music  industry  has  been  dramatic.  
Although  hardware and software exists for this  technology,  in 
general it has been quite expensive.   As an example, the Roland 
MPU401  interface,  the most powerful interface for  the  IBM-PC 
family of computers is about $600 list price.   While there have 
been  others developed for a lower cost,  for example the  board 
listed  in  the  June  1986 BYTE  magazine  article,  these  are 
somewhat  complex.   I hope to offer  the  hobbiest/experimenter 
with  a lower cost alternative,  and yet a challenge to  develop 
some or all of the software as a project.

Without going deeply into the technical side of MIDI,  it  seems 
to  at  first  scare the world.   It runs at a high  data  rate, 
32.1250Kbps,  use the odd interface of approximately 5ma current 
loop  and  be optically coupled.   This  sounds  like  something 
totally out of the realm of the home hobbiest.   Not at all,  in 
fact, it is not only possible, it is quite easy.

Originally, IBM made the Asynchronous Communications Adapter for 
our IBM-PC's and they didn't know anything about MIDI.  They did 
however  give us the tools we need that can be used to interface 
to MIDI systems with minimum hardware modification and  software 
generation.

From here on, I will be discussing modifying an IBM Asynchronous 
Communications Adapter to work with MIDI systems.   While I have 
no  experience with clone serial communications boards,  I  will 
assume that they could be modified similarly and will attempt to 
do  it sometime.   

This  discussion  will be quite technical,  but not  beyond  the 
average experimenter.   I hope you will try the ideas  presented 
here  and  pass your findings along to all of us on the  various 
BBS's.

DATA RATE GENERATION

The original IBM Asynchronous Communications Adapter was capable 
of serial data rates from about 45 baud to 19200 bits per second 
in 5,6,7 and 8 data bits with 1,  1.5 and 2 stop bits, even, odd 
or no parity.   In MIDI,  we would like to run at 31250 bits per 
second,  8 data bits,  no parity and one stop bit.   Well,  just 
change    the   initialization   number,    we   would    think.  
Unfortunately,  the  comm port can't be programmed as it  stands 
for  that baud rate which brings us to the  first  modification.  
The  baud  rate  timing  in  the comm port  is  generated  by  a 
18.432MHz oscillator labeled in my schematic as U10.   This  is 
then  divided by 10 in U6 to get 1.8432MHz,  the standard  baud 
rate generator.   The 8250 UART U11 which actually does all  the 
work  has an on-chip oscillator which could be used to  generate 
the desired frequency.  

As it turns out,  by removing U6,  the 7490 used to divide by 10 
and  connecting  a 3MHz crystal between pins 16 and 17 of  U11, 
the  8250,  the  comm port will now operate at  31250  bits  per 
second, the MIDI standard.

The comm port will no longer operate as a standard serial board, 
but who cares.  These things are cheap enough to convert to MIDI 
permanently.

On the Serial/Printer Adapter which is the type used in the IBM-
PC/AT,   the   generation  is  slightly  different.    The  base 
oscillator is 1.8432MHz as it comes from the factory.   This is 
buffered in U11,  a 74LS05.   The final serial port device is  a 
NS16450,  an  upgraded 8250.   This board requires breaking the 
foil trace between pin 2 on U11 and pin 16 on U5,  the NS16450.  
This can be simply a cut with an X-Acto knife.   Then connect  a 
3MHz crystal between pins 16 and 17 as in the other board.  

The  maximum operating frequency of both boards is 3.1MHz,  but 
there  is adequate "head room" for this to work  satisfactorily.  
It also turns out that by using the 3Mhz crystal,  the internal 
divisor ratio is such that when you tell the port to  initialize 
for 19200bps,  it will actually configure itself for 31250bps.  
The ratio of 3.0Mhz to 1.8432MHz equals the ratio of 31250bps 
to   19200bps  (3/1.8432  =  31250/19200).    This  will   have 
implications which will be described later in the software.

5 Ma CURRENT LOOP

The   original  IBM  Asynchronous  Communications  Adapter   had 
provisions  for the archaic 20 ma current loop  standard.   This 
has  disappeared  on the Serial/Printer Adapter and  most  clone 
adapters.   For our purposes,  this is a shame.  I will describe 
first  converting the IBM Asynchronous Communications Adapter to 
5ma  current  loop  then provide some  thoughts  on  the  other 
adapters.

On  the  IBM  Asynchronous  Communications  Adapter,  the  20ma 
current  loop was configured by turning jumper block XU5  around 
opposite   of  that  required  by  RS-232  (yes,   I  am   being 
intentionally vague, because I can't remember off hand which way 
that  is).   The 20ma current loop is provided by 3 sections of 
U8  paralleled  and  driving the 20ma loop through  a  100  ohm 
resistor,  R3.  By changing this resistor to a 390 ohm resistor, 
the  current should be a little hot 5ma.   A 470  ohm  resistor 
could  be used if you are not driving long 5ma  lines.   Either 
will be within safety range of the MIDI requirements.   A 220 in 
series  with a 180 ohm,  would of course be exact.   Any of  the 
above will work fine.

On the recieve side, the IBM Asynchronous Communications Adapter 
already  has  an opto-coupler interface provided  by  U4.   This 
should be useable without modification.

An adapter will be needed to go from the 25 Pin "D" connector on 
the  back  of the Asynchronous Communications Adapter to a  MIDI 
5pin  DIN connector used for MIDI.   The parts for this can  be 
purchased  from  Radio Shack and since I  don't  have  schematic 
capability with this word processor, I won't go into it here.

For  a board other than the Asynchronous Communications  Adapter 
such as a clone or the IBM Serial/Printer Adapter,  an RS-232 to 
5ma  adapter will need to be built.   I won't design one  here, 
it's  really pretty trivial,  but I would suggest receiving  the 
RS-232  with a MC1489 then driving the 5ma with 3 sections of a 
74LS04  tied  in parallel then driving MIDI through  a  390  ohm 
resistor.   The  receive side could use any of the  optocouplers 
that are usually specified for MIDI, such as the one in the BYTE 
article mentioned above.   This could then drive a MC1488 RS-232 
line  driver.   A  small  5volt power supply will  have  to  be 
provided in this interface.

I  might  suggest that if you have to build the RS-232  to  5ma 
converter,  use  some  of the extra sections of the  devices  to 
build some MIDI through buffers, splitters, etc.

MIDI SOFTWARE

Without  going  into  the software in great  detail,  there  are 
several  built-ins and hints that I can give which may  help  in 
writing  your own software package.   All of the software  ideas 
are  in  IBM BASIC for clarity.   These built-ins  are  probably 
available in other languages as well.

The  first thing we will need is beat timing or tempo.   I  have 
chosen the easy way out again.  I built a tempo generator with a 
type 555 timer and a few components that generates a pulse at 24 
times  the quarter note beat.   This allows me to generate  32nd 
notes  and 16th triplets,  not that I would ever play that fast.  
I  built  it  with  a range of 20 to 240  beats  per  minute  (8 
pulses/second  to 96 pulses/second).   This I connected  to  the 
trigger input of a game port.   Again, I had one and didn't feel 
like  building a trigger timer board.   This I control manually, 
but  you could use the internal timer section 2 of the  8253  on 
your IBM-PC mother board.  I don't know how to do this and would 
appreciate if anyone knows how, please tell me.

I  use  the  "ON  TRIG(1)"  statement in  BASIC  to  jump  to  a 
subroutine in which I keep track of which portion of a beat I am 
in.   This  provides  the  basic timing for  both  transmit  and 
receive.   I  will come back to this later.  I wish that IBM had 
given  us better resolution on the ON TIMER function,  it  could 
have  been  used  as  a beat counter  but  with  only  1  second 
resolution there isn't much you can do with it unless your music 
is VERY VERY slow.

The  initialization  of  the  serial port  is  quite  simple  to 
implement  for  MIDI.   I use the "OPEN  COM1:19200,N,8,1,CS,DS" 
statement  to  initialize the port.   Remember that  because  we 
changed  the crystal to 3MHz,  opening at 19200 in software  is 
actually  opening at 31250 bps.   This works!!!   I  don't  like 
error  checking  in  hardware,  so  I disable the  CTS  and  DTS 
signals.  

I  have notes to be transmitted assigned to portions of a  beat.  
These  are  built off-line by a conversion  routine  that  takes 
information  from  the music processor SongWright and  builds  a 
file  of notes and timing to be transmitted over MIDI.   I won't 
go into how this works until I get it totally ready, but what it 
does is this:

     When a TRIG(1) interrupt occurs,  the software checks if  a      
     note  or group of notes are to be sent.   If they  are,  it 
     builds the group of notes with statements like

          J$ = CHR$(14)+CHR$(23)+CHR$(77)...

     Then transmits the string with a 

          PRINT#1,J$

     Since the output is a buffered,  interrupt driven transmit, 
     the  notes are transmitted at 31250 bps.  with  no  further 
     assistance  from the user.   Unless there is a LOT of notes 
     to  be sent,  as in 16 voice chords,  along with  big  drum 
     sounds, they should sound correct.  This is a limitation of 
     the  transmission  media,  MIDI,  however and not  the  IBM 
     hardware.

I also use the "ON COM(1)" statement to set up a receive routine 
for  MIDI.   This allows me to avoid polling the receive side so 
that I can do other things.  When a note is received via MIDI, I 
jump to a routine that gets the note,  then reads the portion of 
beat counters to see what beat time I should assign to  it.   It 
checks for several other things, like note off, system messages, 
etc.   These  are  interpreted and used  where  appropriate.   I 
assume  that  I can receive anything anytime and I have to  know 
what  I  received  and  what to do with it so  this  routine  is 
potentially a little longer than necessary.

CONCLUSION

I  have attempted to describe a hardware and software experiment 
into  the fascinating world of MIDI.   I hope to  continue  with 
this experiment and eventually build a full MIDI system with all 
of  the  features we have dreamed about.   I would like  to  get 
input from all you and hope you will help me in this experiment.  
If you develop any software in this line,  please make it public 
domain so that we all can enjoy it.  

 
 
 
  Another file downloaded from:   
 
         !
        -$-             & the Temple of the Screaming Electron
         !    *                    Walnut Creek, CA
   +    /^\   |
   !    | |/\/^\  _^_     2400/1200/300 baud  (415) 935-5845  
  /^\  /   @ |  \/_-_\            Jeff Hunter, Sysop
  |@ \_| @     @|- - -|                                  \   
  |  | |    /^\ |  _  |                  - - - - - - - - - * 
  |___/_\___|_|_|_(_)_|       Aaaaaeeeeeeeeeeeeeeeeee!   /   
 
       Specializing in conversations, E-Mail, obscure information,
   entertainment, the arts, politics, futurism, thoughtful discussion, 
          insane speculation, and wild rumours. An ALL-TEXT BBS.
 
                         "Raw Data for Raw Nerves." 
 


Make REAL money with your website!

The entire AOH site is optimized to look best in Firefox® 2.0 on a widescreen monitor (1440x900 or better).
Site design & layout copyright © 1986-2008 AOH
We do not send spam. If you have received spam bearing an artofhacking.com email address, please forward it with full headers to abuse@artofhacking.com.