MIDI event to OPL

DOS specific questions.
Post Reply
angros47
Posts: 2321
Joined: Jun 21, 2005 19:04

MIDI event to OPL

Post by angros47 »

This is an example (loosely based on RealMidi by Sebastian Mate) to play MIDI events on a Sound Blaster, using hardware FM synthesis.

It does not work on more modern cards, since it requires the OPL2 or OPL3 chip, that is not provided on sound cards any more. It works on DosBox.

Code: Select all

dim shared instruments(128,10) as ubyte={_   
       {  &H21,  &H21,  &H8f,  &H0c,  &Hf2,  &Hf2,  &H45,  &H76,  &H00,  &H00,  &H08 },_ '/* Acoustic Grand */
       {  &H31,  &H21,  &H4b,  &H09,  &Hf2,  &Hf2,  &H54,  &H56,  &H00,  &H00,  &H08 },_ '/* Bright Acoustic */
       {  &H31,  &H21,  &H49,  &H09,  &Hf2,  &Hf2,  &H55,  &H76,  &H00,  &H00,  &H08 },_ '/* Electric Grand */
       {  &Hb1,  &H61,  &H0e,  &H09,  &Hf2,  &Hf3,  &H3b,  &H0b,  &H00,  &H00,  &H06 },_ '/* Honky-Tonk */
       {  &H01,  &H21,  &H57,  &H09,  &Hf1,  &Hf1,  &H38,  &H28,  &H00,  &H00,  &H00 },_ '/* Electric Piano 1 */
       {  &H01,  &H21,  &H93,  &H09,  &Hf1,  &Hf1,  &H38,  &H28,  &H00,  &H00,  &H00 },_ '/* Electric Piano 2 */
       {  &H21,  &H36,  &H80,  &H17,  &Ha2,  &Hf1,  &H01,  &Hd5,  &H00,  &H00,  &H08 },_ '/* Harpsichord */
       {  &H01,  &H01,  &H92,  &H09,  &Hc2,  &Hc2,  &Ha8,  &H58,  &H00,  &H00,  &H0a },_ '/* Clav */
       {  &H0c,  &H81,  &H5c,  &H09,  &Hf6,  &Hf3,  &H54,  &Hb5,  &H00,  &H00,  &H00 },_ '/* Celesta */
       {  &H07,  &H11,  &H97,  &H89,  &Hf6,  &Hf5,  &H32,  &H11,  &H00,  &H00,  &H02 },_ '/* Glockenspiel */
       {  &H17,  &H01,  &H21,  &H09,  &H56,  &Hf6,  &H04,  &H04,  &H00,  &H00,  &H02 },_ '/* Music Box */
       {  &H18,  &H81,  &H62,  &H09,  &Hf3,  &Hf2,  &He6,  &Hf6,  &H00,  &H00,  &H00 },_ '/* Vibraphone */
       {  &H18,  &H21,  &H23,  &H09,  &Hf7,  &He5,  &H55,  &Hd8,  &H00,  &H00,  &H00 },_ '/* Marimba */
       {  &H15,  &H01,  &H91,  &H09,  &Hf6,  &Hf6,  &Ha6,  &He6,  &H00,  &H00,  &H04 },_ '/* Xylophone */
       {  &H45,  &H81,  &H59,  &H89,  &Hd3,  &Ha3,  &H82,  &He3,  &H00,  &H00,  &H0c },_ '/* Tubular Bells */
       {  &H03,  &H81,  &H49,  &H89,  &H74,  &Hb3,  &H55,  &H05,  &H01,  &H00,  &H04 },_ '/* Dulcimer */
       {  &H71,  &H31,  &H92,  &H09,  &Hf6,  &Hf1,  &H14,  &H07,  &H00,  &H00,  &H02 },_ '/* Drawbar Organ */
       {  &H72,  &H30,  &H14,  &H09,  &Hc7,  &Hc7,  &H58,  &H08,  &H00,  &H00,  &H02 },_ '/* Percussive Organ */
       {  &H70,  &Hb1,  &H44,  &H09,  &Haa,  &H8a,  &H18,  &H08,  &H00,  &H00,  &H04 },_ '/* Rock Organ */
       {  &H23,  &Hb1,  &H93,  &H09,  &H97,  &H55,  &H23,  &H14,  &H01,  &H00,  &H04 },_ '/* Church Organ */
       {  &H61,  &Hb1,  &H13,  &H89,  &H97,  &H55,  &H04,  &H04,  &H01,  &H00,  &H00 },_ '/* Reed Organ */
       {  &H24,  &Hb1,  &H48,  &H09,  &H98,  &H46,  &H2a,  &H1a,  &H01,  &H00,  &H0c },_ '/* Accoridan */
       {  &H61,  &H21,  &H13,  &H09,  &H91,  &H61,  &H06,  &H07,  &H01,  &H00,  &H0a },_ '/* Harmonica */
       {  &H21,  &Ha1,  &H13,  &H92,  &H71,  &H61,  &H06,  &H07,  &H00,  &H00,  &H06 },_ '/* Tango Accordian */
       {  &H02,  &H41,  &H9c,  &H89,  &Hf3,  &Hf3,  &H94,  &Hc8,  &H01,  &H00,  &H0c },_ '/* Acoustic Guitar(nylon) */
       {  &H03,  &H11,  &H54,  &H09,  &Hf3,  &Hf1,  &H9a,  &He7,  &H01,  &H00,  &H0c },_ '/* Acoustic Guitar(steel) */
       {  &H23,  &H21,  &H5f,  &H09,  &Hf1,  &Hf2,  &H3a,  &Hf8,  &H00,  &H00,  &H00 },_ '/* Electric Guitar(jazz) */
       {  &H03,  &H21,  &H87,  &H89,  &Hf6,  &Hf3,  &H22,  &Hf8,  &H01,  &H00,  &H06 },_ '/* Electric Guitar(clean) */
       {  &H03,  &H21,  &H47,  &H09,  &Hf9,  &Hf6,  &H54,  &H3a,  &H00,  &H00,  &H00 },_ '/* Electric Guitar(muted) */
       {  &H23,  &H21,  &H4a,  &H0e,  &H91,  &H84,  &H41,  &H19,  &H01,  &H00,  &H08 },_ '/* Overdriven Guitar */
       {  &H23,  &H21,  &H4a,  &H09,  &H95,  &H94,  &H19,  &H19,  &H01,  &H00,  &H08 },_ '/* Distortion Guitar */
       {  &H09,  &H84,  &Ha1,  &H89,  &H20,  &Hd1,  &H4f,  &Hf8,  &H00,  &H00,  &H08 },_ '/* Guitar Harmonics */
       {  &H21,  &Ha2,  &H1e,  &H09,  &H94,  &Hc3,  &H06,  &Ha6,  &H00,  &H00,  &H02 },_ '/* Acoustic Bass */
       {  &H31,  &H31,  &H12,  &H09,  &Hf1,  &Hf1,  &H28,  &H18,  &H00,  &H00,  &H0a },_ '/* Electric Bass(finger) */
       {  &H31,  &H31,  &H8d,  &H09,  &Hf1,  &Hf1,  &He8,  &H78,  &H00,  &H00,  &H0a },_ '/* Electric Bass(pick) */
       {  &H31,  &H32,  &H5b,  &H09,  &H51,  &H71,  &H28,  &H48,  &H00,  &H00,  &H0c },_ '/* Fretless Bass */
       {  &H01,  &H21,  &H8b,  &H49,  &Ha1,  &Hf2,  &H9a,  &Hdf,  &H00,  &H00,  &H08 },_ '/* Slap Bass 1 */
       {  &H21,  &H21,  &H8b,  &H11,  &Ha2,  &Ha1,  &H16,  &Hdf,  &H00,  &H00,  &H08 },_ '/* Slap Bass 2 */
       {  &H31,  &H31,  &H8b,  &H09,  &Hf4,  &Hf1,  &He8,  &H78,  &H00,  &H00,  &H0a },_ '/* Synth Bass 1 */
       {  &H31,  &H31,  &H12,  &H09,  &Hf1,  &Hf1,  &H28,  &H18,  &H00,  &H00,  &H0a },_ '/* Synth Bass 2 */
       {  &H31,  &H21,  &H15,  &H09,  &Hdd,  &H56,  &H13,  &H26,  &H01,  &H00,  &H08 },_ '/* Violin */
       {  &H31,  &H21,  &H16,  &H09,  &Hdd,  &H66,  &H13,  &H06,  &H01,  &H00,  &H08 },_ '/* Viola */
       {  &H71,  &H31,  &H49,  &H09,  &Hd1,  &H61,  &H1c,  &H0c,  &H01,  &H00,  &H08 },_ '/* Cello */
       {  &H21,  &H23,  &H4d,  &H89,  &H71,  &H72,  &H12,  &H06,  &H01,  &H00,  &H02 },_ '/* Contrabass */
       {  &Hf1,  &He1,  &H40,  &H09,  &Hf1,  &H6f,  &H21,  &H16,  &H01,  &H00,  &H02 },_ '/* Tremolo Strings */
       {  &H02,  &H01,  &H1a,  &H89,  &Hf5,  &H85,  &H75,  &H35,  &H01,  &H00,  &H00 },_ '/* Pizzicato Strings */
       {  &H02,  &H01,  &H1d,  &H89,  &Hf5,  &Hf3,  &H75,  &Hf4,  &H01,  &H00,  &H00 },_ '/* Orchestral Strings */
       {  &H10,  &H11,  &H41,  &H09,  &Hf5,  &Hf2,  &H05,  &Hc3,  &H01,  &H00,  &H02 },_ '/* Timpani */
       {  &H21,  &Ha2,  &H9b,  &H0a,  &Hb1,  &H72,  &H25,  &H08,  &H01,  &H00,  &H0e },_ '/* String Ensemble 1 */
       {  &Ha1,  &H21,  &H98,  &H09,  &H7f,  &H3f,  &H03,  &H07,  &H01,  &H01,  &H00 },_ '/* String Ensemble 2 */
       {  &Ha1,  &H61,  &H93,  &H09,  &Hc1,  &H4f,  &H12,  &H05,  &H00,  &H00,  &H0a },_ '/* SynthStrings 1 */
       {  &H21,  &H61,  &H18,  &H09,  &Hc1,  &H4f,  &H22,  &H05,  &H00,  &H00,  &H0c },_ '/* SynthStrings 2 */
       {  &H31,  &H72,  &H5b,  &H8c,  &Hf4,  &H8a,  &H15,  &H05,  &H00,  &H00,  &H00 },_ '/* Choir Aahs */
       {  &Ha1,  &H61,  &H90,  &H09,  &H74,  &H71,  &H39,  &H67,  &H00,  &H00,  &H00 },_ '/* Voice Oohs */
       {  &H71,  &H72,  &H57,  &H09,  &H54,  &H7a,  &H05,  &H05,  &H00,  &H00,  &H0c },_ '/* Synth Voice */
       {  &H90,  &H41,  &H00,  &H09,  &H54,  &Ha5,  &H63,  &H45,  &H00,  &H00,  &H08 },_ '/* Orchestra Hit */
       {  &H21,  &H21,  &H92,  &H0a,  &H85,  &H8f,  &H17,  &H09,  &H00,  &H00,  &H0c },_ '/* Trumpet */
       {  &H21,  &H21,  &H94,  &H0e,  &H75,  &H8f,  &H17,  &H09,  &H00,  &H00,  &H0c },_ '/* Trombone */
       {  &H21,  &H61,  &H94,  &H09,  &H76,  &H82,  &H15,  &H37,  &H00,  &H00,  &H0c },_ '/* Tuba */
       {  &H31,  &H21,  &H43,  &H09,  &H9e,  &H62,  &H17,  &H2c,  &H01,  &H01,  &H02 },_ '/* Muted Trumpet */
       {  &H21,  &H21,  &H9b,  &H09,  &H61,  &H7f,  &H6a,  &H0a,  &H00,  &H00,  &H02 },_ '/* French Horn */
       {  &H61,  &H22,  &H8a,  &H0f,  &H75,  &H74,  &H1f,  &H0f,  &H00,  &H00,  &H08 },_ '/* Brass Section */
       {  &Ha1,  &H21,  &H86,  &H8c,  &H72,  &H71,  &H55,  &H18,  &H01,  &H00,  &H00 },_ '/* SynthBrass 1 */
       {  &H21,  &H21,  &H4d,  &H09,  &H54,  &Ha6,  &H3c,  &H1c,  &H00,  &H00,  &H08 },_ '/* SynthBrass 2 */
       {  &H31,  &H61,  &H8f,  &H09,  &H93,  &H72,  &H02,  &H0b,  &H01,  &H00,  &H08 },_ '/* Soprano Sax */
       {  &H31,  &H61,  &H8e,  &H09,  &H93,  &H72,  &H03,  &H09,  &H01,  &H00,  &H08 },_ '/* Alto Sax */
       {  &H31,  &H61,  &H91,  &H09,  &H93,  &H82,  &H03,  &H09,  &H01,  &H00,  &H0a },_ '/* Tenor Sax */
       {  &H31,  &H61,  &H8e,  &H09,  &H93,  &H72,  &H0f,  &H0f,  &H01,  &H00,  &H0a },_ '/* Baritone Sax */
       {  &H21,  &H21,  &H4b,  &H09,  &Haa,  &H8f,  &H16,  &H0a,  &H01,  &H00,  &H08 },_ '/* Oboe */
       {  &H31,  &H21,  &H90,  &H09,  &H7e,  &H8b,  &H17,  &H0c,  &H01,  &H01,  &H06 },_ '/* English Horn */
       {  &H31,  &H32,  &H81,  &H09,  &H75,  &H61,  &H19,  &H19,  &H01,  &H00,  &H00 },_ '/* Bassoon */
       {  &H32,  &H21,  &H90,  &H09,  &H9b,  &H72,  &H21,  &H17,  &H00,  &H00,  &H04 },_ '/* Clarinet */
       {  &He1,  &He1,  &H1f,  &H09,  &H85,  &H65,  &H5f,  &H1a,  &H00,  &H00,  &H00 },_ '/* Piccolo */
       {  &He1,  &He1,  &H46,  &H09,  &H88,  &H65,  &H5f,  &H1a,  &H00,  &H00,  &H00 },_ '/* Flute */
       {  &Ha1,  &H21,  &H9c,  &H09,  &H75,  &H75,  &H1f,  &H0a,  &H00,  &H00,  &H02 },_ '/* Recorder */
       {  &H31,  &H21,  &H8b,  &H09,  &H84,  &H65,  &H58,  &H1a,  &H00,  &H00,  &H00 },_ '/* Pan Flute */
       {  &He1,  &Ha1,  &H4c,  &H09,  &H66,  &H65,  &H56,  &H26,  &H00,  &H00,  &H00 },_ '/* Blown Bottle */
       {  &H62,  &Ha1,  &Hcb,  &H09,  &H76,  &H55,  &H46,  &H36,  &H00,  &H00,  &H00 },_ '/* Skakuhachi */
       {  &H62,  &Ha1,  &Ha2,  &H09,  &H57,  &H56,  &H07,  &H07,  &H00,  &H00,  &H0b },_ '/* Whistle */
       {  &H62,  &Ha1,  &H9c,  &H09,  &H77,  &H76,  &H07,  &H07,  &H00,  &H00,  &H0b },_ '/* Ocarina */
       {  &H22,  &H21,  &H59,  &H09,  &Hff,  &Hff,  &H03,  &H0f,  &H02,  &H00,  &H00 },_ '/* Lead 1 (square) */
       {  &H21,  &H21,  &H0e,  &H09,  &Hff,  &Hff,  &H0f,  &H0f,  &H01,  &H01,  &H00 },_ '/* Lead 2 (sawtooth) */
       {  &H22,  &H21,  &H46,  &H89,  &H86,  &H64,  &H55,  &H18,  &H00,  &H00,  &H00 },_ '/* Lead 3 (calliope) */
       {  &H21,  &Ha1,  &H45,  &H09,  &H66,  &H96,  &H12,  &H0a,  &H00,  &H00,  &H00 },_ '/* Lead 4 (chiff) */
       {  &H21,  &H22,  &H8b,  &H09,  &H92,  &H91,  &H2a,  &H2a,  &H01,  &H00,  &H00 },_ '/* Lead 5 (charang) */
       {  &Ha2,  &H61,  &H9e,  &H49,  &Hdf,  &H6f,  &H05,  &H07,  &H00,  &H00,  &H02 },_ '/* Lead 6 (voice) */
       {  &H20,  &H60,  &H1a,  &H09,  &Hef,  &H8f,  &H01,  &H06,  &H00,  &H02,  &H00 },_ '/* Lead 7 (fifths) */
       {  &H21,  &H21,  &H8f,  &H86,  &Hf1,  &Hf4,  &H29,  &H09,  &H00,  &H00,  &H0a },_ '/* Lead 8 (bass+lead) */
       {  &H77,  &Ha1,  &Ha5,  &H09,  &H53,  &Ha0,  &H94,  &H05,  &H00,  &H00,  &H02 },_ '/* Pad 1 (new age) */
       {  &H61,  &Hb1,  &H1f,  &H89,  &Ha8,  &H25,  &H11,  &H03,  &H00,  &H00,  &H0a },_ '/* Pad 2 (warm) */
       {  &H61,  &H61,  &H17,  &H09,  &H91,  &H55,  &H34,  &H16,  &H00,  &H00,  &H0c },_ '/* Pad 3 (polysynth) */
       {  &H71,  &H72,  &H5d,  &H09,  &H54,  &H6a,  &H01,  &H03,  &H00,  &H00,  &H00 },_ '/* Pad 4 (choir) */
       {  &H21,  &Ha2,  &H97,  &H09,  &H21,  &H42,  &H43,  &H35,  &H00,  &H00,  &H08 },_ '/* Pad 5 (bowed) */
       {  &Ha1,  &H21,  &H1c,  &H09,  &Ha1,  &H31,  &H77,  &H47,  &H01,  &H01,  &H00 },_ '/* Pad 6 (metallic) */
       {  &H21,  &H61,  &H89,  &H0c,  &H11,  &H42,  &H33,  &H25,  &H00,  &H00,  &H0a },_ '/* Pad 7 (halo) */
       {  &Ha1,  &H21,  &H15,  &H09,  &H11,  &Hcf,  &H47,  &H07,  &H01,  &H00,  &H00 },_ '/* Pad 8 (sweep) */
       {  &H3a,  &H51,  &Hce,  &H09,  &Hf8,  &H86,  &Hf6,  &H02,  &H00,  &H00,  &H02 },_ '/* FX 1 (rain) */
       {  &H21,  &H21,  &H15,  &H09,  &H21,  &H41,  &H23,  &H13,  &H01,  &H00,  &H00 },_ '/* FX 2 (soundtrack) */
       {  &H06,  &H01,  &H5b,  &H09,  &H74,  &Ha5,  &H95,  &H72,  &H00,  &H00,  &H00 },_ '/* FX 3 (crystal) */
       {  &H22,  &H61,  &H92,  &H8c,  &Hb1,  &Hf2,  &H81,  &H26,  &H00,  &H00,  &H0c },_ '/* FX 4 (atmosphere) */
       {  &H41,  &H42,  &H4d,  &H09,  &Hf1,  &Hf2,  &H51,  &Hf5,  &H01,  &H00,  &H00 },_ '/* FX 5 (brightness) */
       {  &H61,  &Ha3,  &H94,  &H89,  &H11,  &H11,  &H51,  &H13,  &H01,  &H00,  &H06 },_ '/* FX 6 (goblins) */
       {  &H61,  &Ha1,  &H8c,  &H89,  &H11,  &H1d,  &H31,  &H03,  &H00,  &H00,  &H06 },_ '/* FX 7 (echoes) */
       {  &Ha4,  &H61,  &H4c,  &H09,  &Hf3,  &H81,  &H73,  &H23,  &H01,  &H00,  &H04 },_ '/* FX 8 (sci-fi) */
       {  &H02,  &H07,  &H85,  &H0c,  &Hd2,  &Hf2,  &H53,  &Hf6,  &H00,  &H01,  &H00 },_ '/* Sitar */
       {  &H11,  &H13,  &H0c,  &H89,  &Ha3,  &Ha2,  &H11,  &He5,  &H01,  &H00,  &H00 },_ '/* Banjo */
       {  &H11,  &H11,  &H06,  &H09,  &Hf6,  &Hf2,  &H41,  &He6,  &H01,  &H02,  &H04 },_ '/* Shamisen */
       {  &H93,  &H91,  &H91,  &H09,  &Hd4,  &Heb,  &H32,  &H11,  &H00,  &H01,  &H08 },_ '/* Koto */
       {  &H04,  &H01,  &H4f,  &H09,  &Hfa,  &Hc2,  &H56,  &H05,  &H00,  &H00,  &H0c },_ '/* Kalimba */
       {  &H21,  &H22,  &H49,  &H09,  &H7c,  &H6f,  &H20,  &H0c,  &H00,  &H01,  &H06 },_ '/* Bagpipe */
       {  &H31,  &H21,  &H85,  &H09,  &Hdd,  &H56,  &H33,  &H16,  &H01,  &H00,  &H0a },_ '/* Fiddle */
       {  &H20,  &H21,  &H04,  &H8a,  &Hda,  &H8f,  &H05,  &H0b,  &H02,  &H00,  &H06 },_ '/* Shanai */
       {  &H05,  &H03,  &H6a,  &H89,  &Hf1,  &Hc3,  &He5,  &He5,  &H00,  &H00,  &H06 },_ '/* Tinkle Bell */
       {  &H07,  &H02,  &H15,  &H09,  &Hec,  &Hf8,  &H26,  &H16,  &H00,  &H00,  &H0a },_ '/* Agogo */
       {  &H05,  &H01,  &H9d,  &H09,  &H67,  &Hdf,  &H35,  &H05,  &H00,  &H00,  &H08 },_ '/* Steel Drums */
       {  &H18,  &H12,  &H96,  &H09,  &Hfa,  &Hf8,  &H28,  &He5,  &H00,  &H00,  &H0a },_ '/* Woodblock */
       {  &H10,  &H00,  &H86,  &H0c,  &Ha8,  &Hfa,  &H07,  &H03,  &H00,  &H00,  &H06 },_ '/* Taiko Drum */
       {  &H11,  &H10,  &H41,  &H0c,  &Hf8,  &Hf3,  &H47,  &H03,  &H02,  &H00,  &H04 },_ '/* Melodic Tom */
       {  &H01,  &H10,  &H8e,  &H09,  &Hf1,  &Hf3,  &H06,  &H02,  &H02,  &H00,  &H0e },_ '/* Synth Drum */
       {  &H0e,  &Hc0,  &H00,  &H09,  &H1f,  &H1f,  &H00,  &Hff,  &H00,  &H03,  &H0e },_ '/* Reverse Cymbal */
       {  &H06,  &H03,  &H80,  &H91,  &Hf8,  &H56,  &H24,  &H84,  &H00,  &H02,  &H0e },_ '/* Guitar Fret Noise */
       {  &H0e,  &Hd0,  &H00,  &H0e,  &Hf8,  &H34,  &H00,  &H04,  &H00,  &H03,  &H0e },_ '/* Breath Noise */
       {  &H0e,  &Hc0,  &H00,  &H09,  &Hf6,  &H1f,  &H00,  &H02,  &H00,  &H03,  &H0e },_ '/* Seashore */
       {  &Hd5,  &Hda,  &H95,  &H49,  &H37,  &H56,  &Ha3,  &H37,  &H00,  &H00,  &H00 },_ '/* Bird Tweet */
       {  &H35,  &H14,  &H5c,  &H11,  &Hb2,  &Hf4,  &H61,  &H15,  &H02,  &H00,  &H0a },_ '/* Telephone ring */
       {  &H0e,  &Hd0,  &H00,  &H09,  &Hf6,  &H4f,  &H00,  &Hf5,  &H00,  &H03,  &H0e },_ '/* Helicopter */
       {  &H26,  &He4,  &H00,  &H09,  &Hff,  &H12,  &H01,  &H16,  &H00,  &H01,  &H0e },_ '/* Applause */
       {  &H00,  &H00,  &H00,  &H09,  &Hf3,  &Hf6,  &Hf0,  &Hc9,  &H00,  &H02,  &H0e }}  '/* Gunshot */

DIM SHARED DrumSetUp(35 TO 81, 10)  AS ubyte={_   'commento
	{ 0, 0, 13, 0, 232, 165, 239, 255, 0, 0, 6},_   'BDRUM2  
	{ 0, 0, 11, 0, 168, 214, 76, 79, 0, 0, 0},_   'BDRUM1  
	{ 100, 3, 2, 64, 178, 151, 162, 212, 2, 1, 14},_   'HIHAT   
	{ 6, 0, 0, 0, 240, 248, 240, 182, 0, 0, 14},_   'SNARE1  
	{ 6, 0, 0, 0, 240, 248, 240, 182, 0, 0, 14},_   'SNARE1  
	{ 6, 0, 0, 0, 240, 246, 240, 180, 0, 0, 14},_   'SNARE2  
	{ 1, 2, 0, 0, 251, 215, 191, 63, 0, 0, 8},_   'TOM     
	{ 100, 3, 2, 64, 178, 151, 162, 212, 2, 1, 14},_   'HIHAT   
	{ 1, 2, 0, 0, 251, 215, 191, 63, 0, 0, 8},_   'TOM       
	{ 100, 3, 2, 64, 178, 151, 162, 212, 2, 1, 14},_   'HIHAT
	{ 1, 2, 0, 0, 251, 215, 191, 63, 0, 0, 8},_   'TOM       
	{ 100, 3, 2, 64, 178, 151, 162, 212, 2, 1, 14},_   'HIHAT      
	{ 1, 2, 0, 0, 251, 215, 191, 63, 0, 0, 8},_   'TOM     
	{ 1, 2, 0, 0, 251, 215, 191, 63, 0, 0, 8},_   'TOM     
	{ 36, 5, 0, 64, 181, 213, 84, 133, 0, 1, 14},_   'CYMBAL  
	{ 1, 2, 0, 0, 251, 215, 191, 63, 0, 0, 8},_   'TOM     
	{ 36, 5, 0, 64, 181, 213, 84, 133, 0, 1, 14},_   'CYMBAL  
	{ 36, 5, 0, 64, 181, 213, 84, 133, 0, 1, 14},_   'CYMBAL  
	{ 7, 18, 79, 0, 242, 242, 96, 114, 0, 0, 8},_   'BELLS   
	{ 6, 196, 0, 3, 240, 196, 240, 52, 0, 0, 14},_   'SNARELNG
	{ 36, 5, 0, 64, 181, 213, 84, 133, 0, 1, 14},_   'CYMBAL  
	{ 7, 18, 79, 0, 242, 242, 96, 114, 0, 0, 8},_   'BELLS   
	{ 36, 5, 0, 64, 181, 213, 84, 133, 0, 1, 14},_   'CYMBAL  
	{ 6, 65, 115, 3, 246, 242, 84, 179, 0, 0, 0},_   'VIBRA   
	{ 36, 5, 0, 64, 181, 213, 84, 133, 0, 1, 14},_   'CYMBAL  
	{ 1, 2, 0, 0, 251, 215, 191, 63, 0, 0, 8},_   'TOM     
	{ 1, 2, 0, 0, 251, 215, 191, 63, 0, 0, 8},_   'TOM     
	{ 1, 2, 0, 0, 251, 215, 191, 63, 0, 0, 8},_   'TOM     
	{ 1, 2, 0, 0, 251, 215, 191, 63, 0, 0, 8},_   'TOM     
	{ 1, 2, 0, 0, 251, 215, 191, 63, 0, 0, 8},_   'TOM     
	{ 79, 1, 129, 0, 239, 150, 1, 241, 0, 0, 4},_   'TINCAN  
	{ 79, 1, 129, 0, 239, 150, 1, 241, 0, 0, 4},_   'TINCAN  
	{ 7, 18, 79, 0, 242, 242, 96, 114, 0, 0, 8},_   'BELLS   
	{ 7, 18, 79, 0, 242, 242, 96, 114, 0, 0, 8},_   'BELLS   
	{ 6, 196, 0, 3, 240, 196, 240, 52, 0, 0, 14},_   'SNARELNG
	{ 6, 196, 0, 3, 240, 196, 240, 52, 0, 0, 14},_   'SNARELNG
	{ 225, 97, 39, 128, 83, 83, 138, 87, 0, 0, 4},_   'FLUTE   
	{ 225, 97, 39, 128, 83, 83, 138, 87, 0, 0, 4},_   'FLUTE   
	{ 100, 3, 2, 64, 178, 151, 162, 212, 2, 1, 14},_   'HIHAT
	{ 100, 3, 2, 64, 178, 151, 162, 212, 2, 1, 14},_   'HIHAT   
	{ 100, 3, 2, 64, 178, 151, 162, 212, 2, 1, 14},_   'HIHAT   
	{ 1, 2, 0, 0, 251, 215, 191, 63, 0, 0, 8},_   'TOM     
	{ 1, 2, 0, 0, 251, 215, 191, 63, 0, 0, 8},_   'TOM     
	{ 5, 1, 78, 0, 218, 249, 37, 21, 0, 0, 10},_   'MARIMBA 
	{ 5, 1, 78, 0, 218, 249, 37, 21, 0, 0, 10},_   'MARIMBA 
	{ 15, 15, 15, 15, 245, 245, 240, 240, 0, 0, 0},_   'TRIANGLE
	{ 15, 15, 15, 15, 245, 245, 240, 240, 0, 0, 0}}   'TRIANGLE



CONST BaseAddr = &H220 'Change if your sound card uses another base address
CONST RegAddr = BaseAddr + 8, DataAddr = BaseAddr + 9


DIM SHARED AS INTEGER Tune, chan, channel, NoTune, PolyPh, MPolyPh, Volume, drumset
DIM SHARED Vol(1 TO 16) AS INTEGER, RealVol(1 TO 16) AS INTEGER
DIM SHARED TrackXisOnCH(0 TO 16, 0 TO 127) AS INTEGER
DIM SHARED ChUse(0 TO 15) AS INTEGER
DIM SHARED voiceset(0 TO 127) AS INTEGER

SUB SetReg (Reg as integer, Value as integer)
	dim X as integer
	OUT RegAddr, Reg
	FOR d as integer = 1 TO 6
		X = INP(RegAddr)
	NEXT 
	OUT DataAddr, Value
	FOR d as integer = 1 TO 6
		X = INP(RegAddr)
	NEXT 
END SUB



sub SetVoice (channel as integer, Selected as integer)
	dim as integer ChanX = (Channel MOD 3) + 8 * INT(Channel / 3)
	SetReg 32 + chanx ,Instruments(Selected, 0 )
	SetReg 35 + chanx ,Instruments(Selected, 1 )
	SetReg 64 + chanx ,Instruments(Selected, 2 )
	SetReg 67 + chanx ,Instruments(Selected, 3 )
	SetReg 96 + chanx ,Instruments(Selected, 4 )
	SetReg 99 + chanx ,Instruments(Selected, 5 )
	SetReg 128 + chanx ,Instruments(Selected, 6 )
	SetReg 131 + chanx ,Instruments(Selected, 7 )
	SetReg 224 + chanx ,Instruments(Selected, 8 )
	SetReg 227 + chanx ,Instruments(Selected, 9 )
	SetReg 192 + channel ,Instruments(Selected, 10 )
end sub

sub SetDrum (channel as integer, Selected as integer)
	dim as integer ChanX = (Channel MOD 3) + 8 * INT(Channel / 3)
	SetReg 32 + chanx ,DrumSetUp(Selected, 0 )
	SetReg 35 + chanx ,DrumSetUp(Selected, 1 )
	SetReg 64 + chanx ,DrumSetUp(Selected, 2 )
	SetReg 67 + chanx ,DrumSetUp(Selected, 3 )
	SetReg 96 + chanx ,DrumSetUp(Selected, 4 )
	SetReg 99 + chanx ,DrumSetUp(Selected, 5 )
	SetReg 128 + chanx ,DrumSetUp(Selected, 6 )
	SetReg 131 + chanx ,DrumSetUp(Selected, 7 )
	SetReg 224 + chanx ,DrumSetUp(Selected, 8 )
	SetReg 227 + chanx ,DrumSetUp(Selected, 9 )
	SetReg 192 + channel ,DrumSetUp(Selected, 10 )
end sub

FUNCTION DetectCard as integer

	'  Purpose:   Detects an AdLib-compatible card.
	'             Returns -1 (true) if detected and 0 (false) if not.
	'  Variables: Nope
	dim as integer a,b,c
	SetReg &H4, &H60
	SetReg &H4, &H80
	B = INP(&H388)
	SetReg &H2, &HFF
	SetReg &H4, &H21
		FOR x as integer = 0 TO 130
			A = INP(&H388)
		NEXT x
	C = INP(&H388)
	SetReg &H4, &H60
	SetReg &H4, &H80

	IF (B AND &HE0) = &H0 THEN
		IF (C AND &HE0) = &HC0 THEN
			return -1
		END IF
	END IF
	return 0

END FUNCTION

SUB ResetFM
	FOR n as integer = 0 TO &HF5
		SetReg n, 0
	NEXT 
	drumset=11

END SUB

SUB SetInstruments
	' Searches a free FM-channel (0-8) and sets the instrument.
	chan = channel
  
	NoTune = 0
	FOR An as integer = 0 TO 8 			' Detect, if the channel is free.
		IF ChUse(An) = 0 THEN chan = An: GOTO selected:
	NEXT An

	FOR An as integer = 0 TO 8 			' If no free channel, "kill" one.
		IF RealVol(An) < (Volume / 10) - 1 THEN
			chan = An
			GOTO selected:
		END IF
	NEXT An

	NoTune = 1: EXIT SUB

selected:
  
	RealVol(chan) = Volume / 10

	SetVoice (chan, voiceset(channel))

	IF channel = drumset - 1 THEN
		IF Tune < 35 OR Tune > 81 THEN
 			SetDrum (chan, 36)
		ELSE
			SetDrum (chan, Tune)
		END IF
	END IF
  
END SUB

SUB MidiTune (Tune as integer, Volume as integer, channel as integer)
	'Plays a Tune

	DIM FRQ as integer

	PolyPh = PolyPh + 1
	IF PolyPh >= MPolyPh THEN MPolyPh = PolyPh

	FRQ = (440 / 32) * (2 ^ ((Tune - 9) / 12)) ' Convert Tune to frequency.
	Vol(channel + 1) = Volume / 10
 
	SetInstruments
	IF NoTune = 1 THEN EXIT SUB

	dim as integer Freq = FRQ
	dim as integer Octv = 5
	TrackXisOnCH(channel, Tune) = chan
	SetReg &HA0 + chan, 0
	SetReg &HB0 + chan, 0
	SetReg &HA0 + chan, Freq AND &HFF
	SetReg &HB0 + chan, INT(Freq / 256) OR 32 OR (Octv * 4)


	'IF channel% = drumset% - 1 THEN Drum

END SUB




sub MidiEvent (event as integer, param1 as integer, param2 as integer)

	channel=event and &H0F

	if (event and &HF0)=&H90 AndAlso b=0 then event=&H80

        select case (event and &HF0)
        case &H80
		'Send: Tune Off
		PolyPh = PolyPh - 1
		Tune = param1
		Volume = param2

		IF channel <> drumset - 1 THEN
			SetReg &HA0 + TrackXisOnCH(channel, Tune), 0
			SetReg &HB0 + TrackXisOnCH(channel, Tune), 0
		END IF
		ChUse(TrackXisOnCH(channel, Tune)) = 0
        case &H90
		'Send: Tune On
		Tune = param1
		Volume = param2
		MidiTune(Tune, Volume, channel)
		ChUse(chan) = 1

        case &HA0
		'Key after-touch
        case &HB0

        case &HC0
		' Change voice
		voiceset(channel) = param1
        case &HD0

        case &HE0

        case &HFE
        case &HFF
        case else
        end select
end sub


ResetFm

midievent(&HC0, 0,80)

midievent(&H90, 90,80)
sleep
midievent(&H80, 90,80)
sleep
What's the use for it? Well, there are some small programs for Windows that use MIDI messages to play simple sound effects; this program could help making them multi-platform.
angros47
Posts: 2321
Joined: Jun 21, 2005 19:04

Re: MIDI event to OPL

Post by angros47 »

Here is a sequencer using it (an improved version of RealMidi by Sebastian Mate for Quick Basic)

Code: Select all

'based on RealMIDI 2.00, by Sebastian Mate



declare sub MidiSend(event as UByte, a as UByte, b as UByte) 









DIM SHARED Header AS STRING * 4
DIM SHARED TweeByte AS STRING * 2
DIM SHARED VierByte AS STRING * 4
DIM SHARED FileType AS STRING * 2


FUNCTION NextNumber as ubyte
 dim a as ubyte
 GET #1, , a
 NextNumber = a
END FUNCTION


FUNCTION ReadVarLen as integer
 dim a as ubyte
 GET #1, , a
 dim as integer Value, Value2
 Value = a
 IF (Value AND 128) THEN
  Value = (Value AND 127)
  DO
   GET #1, , a
   Value2 = a
   Value = (Value * (2 ^ 7)) + (Value2 AND 127)
  LOOP WHILE (Value2 AND 128)
 END IF
 return Value
END FUNCTION


FUNCTION ReadBPM as long
 DIM temp AS LONG
 dim a as ubyte
 GET #1, , a
 IF a = 3 THEN
  FOR i as integer = 1 TO 3
   GET #1, , a
   temp = (temp * 256) + a
  NEXT i
 END IF
 return temp
END FUNCTION

FUNCTION ReadFourBytes as long
 dim t as long
 dim a as ubyte
 GET #1, , a
 t = a * 2 ^ 8
 GET #1, , a
 t = (a + t) * 2 ^ 8
 GET #1, , a
 t = (a + t) * 2 ^ 8
 GET #1, , a
 ReadFourBytes = t + a
END FUNCTION

sub ReadText 
 dim a as ubyte
 dim as integer Lengte = ReadVarLen
 FOR tt as integer= 1 TO Lengte
  GET #1, , a
 NEXT tt
END sub


FUNCTION ReadTwoBytes as short
 dim a as ubyte
 dim t as integer
 GET #1, , a
 t = a * 2 ^ 8
 GET #1, , a
 return t + a
END FUNCTION



var file=command

 OPEN file FOR BINARY AS #1
 GET #1, , Header
 IF Header <> "MThd" THEN PRINT "Not a valid MIDI file": STOP
 GET #1, , VierByte
 GET #1, , FileType
' IF ASC(RIGHT(FileType, 1)) = 0 THEN
' ELSE
'   PRINT "Multy tracks, this file type is not supported.": END
' END IF

 dim Tracks as integer, Divisions as integer, Tempo as integer=60000000/120
 Tracks = ReadTwoBytes
 Divisions = ReadTwoBytes

 dim Track as String
 dim Sequence(Tracks) as String
dim LastPos as integer
for tr as integer=0 to Tracks
	 if eof(1) then exit for
	 GET #1, , Header

	 Track=""
	 var TrkLength = ReadFourBytes

	 LastPos=LOC(1)-2

	 dim a as ubyte, status as ubyte
	 dim as integer tl
 

	 dim SeqTime as Double
	 dim i as integer
	 do
	     if LOC(1)-LastPos>TrkLength orelse eof (1) then exit do
	     tl = ReadVarLen ' Read the delay until we do anything and delay:
	     'dim as double startDelay=timer

	     'do:loop until timer>=StartDelay+(tl / tempo/1.5)
	     SeqTime+=(tl * tempo/Divisions/1e6)
	     

	     GET #1, , a ' Get the MIDI-command...

	     IF a = 255 THEN '... we have a meta-command!
	       GET #1, , a
	       SELECT CASE a
		CASE 47: NextNumber 'End of track
		CASE 81: tempo = ReadBPM
		CASE ELSE
		  ReadText ' Unkown Meta Event
	       END SELECT
	      ELSEIF a = &HF0 OR a = &HF7 THEN
		ReadText
	      ELSE

	       if a>127 then status=a: GET #1, , a
	       SELECT CASE status shr 4
	       case &H8, &H9, &HA, &HB, &HE  
		Track+=mkd(SeqTime)
		Track+=chr(status)
		Track+=chr(a)
		Track+=chr(NextNumber)



	       case &HC, &HD
		Track+=mkd(SeqTime)
		Track+=chr(status)
		Track+=chr(a)
		Track+=chr(0)
	       case else
		exit do



	       End Select




	   END IF
	 loop


	 Sequence(tr)=Track
next
?"Start"

dim as double startDelay=timer
dim p(Tracks) as integer

for i as integer=0 to Tracks
	p(i)=1
next
dim as integer isPlaying
do
	isPlaying=0
	for i as integer=0 to Tracks
		
		if p(i)<len(Sequence(i)) then
		     isPlaying=1
		     dim SeqTime as Double=cvd(mid(Sequence(i),p(i)))

		     if timer>=StartDelay+SeqTime then
		       dim a as ubyte, b as ubyte, c as ubyte
		       a=asc(mid(Sequence(i),p(i)+8))
		       b=asc(mid(Sequence(i),p(i)+9))
		       c=asc(mid(Sequence(i),p(i)+10))

		       if a<>&H99 orelse (b>=35 andalso b<=81) then MidiSend(a,b,c)

		       p(i)+=11
		     end if
		end if
	next
		

loop while isPlaying
Post Reply