MIDI event to OPL

DOS specific questions.
angros47
Posts: 1420
Joined: Jun 21, 2005 19:04

MIDI event to OPL

Postby angros47 » Nov 18, 2014 19:38

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: 1420
Joined: Jun 21, 2005 19:04

Re: MIDI event to OPL

Postby angros47 » May 16, 2018 22:24

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

Return to “DOS”

Who is online

Users browsing this forum: No registered users and 2 guests