' {$STAMP BS2p} ' {$PBASIC 2.5} DATA 4,7,3,7,4,9,5,9,5,7,5,11,6,9,5,12 Midibaud CON 60 Channel CON 15 Noteon VAR Byte Noteoff VAR Byte Noteon = $90 Noteoff = $80 anote VAR Byte onote VAR Byte bnote VAR Byte bonote VAR Byte p1 VAR Byte p2 VAR Byte p3 VAR Byte speed CON 500 lownote CON 19 hhhnote CON 5 p1=4 p2=7 MAINIO DIRS = %0000000000000000 SEROUT Channel, Midibaud, [$b0, $7b, 0] AUXIO DIRS = %0000000000000000 mxxn: MAINIO ' DEBUG DEC(INC) IF INC = 8 OR INC = 12 THEN Noteon = $91 Noteoff = $81 ELSE Noteon = $90 Noteoff = $80 ENDIF IF INC = 4 OR INC = 12 THEN GOTO drumin IF IND-8 <> p3 THEN p3 = IND-8 READ p3*2, p1 READ (p3*2)+1, p2 ELSE ENDIF IF INL <> 0 THEN ' is a key pressed IF INL = 81 THEN GOTO noff anote = INL + lownote ' get the note IF anote <> onote THEN ' a new note SEROUT Channel, Midibaud, [Noteoff, onote, $7F,Noteon, anote, $7F] ', note + 3, $7F, note + 7, $7F ] ' play the note onote = anote ELSE ' not a new note ENDIF ELSE IF onote <> 0 THEN SEROUT Channel, Midibaud, [Noteoff, onote, $7F] ', note + 3, $7F, note + 7, $7F ] ' play the note onote = 0 ELSE ' no note playing ENDIF ENDIF AUXIO ' DEBUG DEC(INL), " " IF INL <> 0 THEN ' is a key pressed bnote = INL + hhhnote ' get the note IF bnote <> bonote THEN ' a new note MAINIO SEROUT Channel, Midibaud, [Noteoff, bonote, $7F, bonote + p1, $7F, bonote + p2, $7F, Noteon, bnote, $7F, bnote + p1, $7F, bnote + p2, $7F ] ' play the note bonote = bnote ELSE ' not a new note ENDIF ELSE IF bonote <> 0 THEN MAINIO SEROUT Channel, Midibaud, [Noteoff, bonote, $7F, bonote + p1, $7F, bonote + p2, $7F ] ' play the note bonote = 0 ELSE ' no note playing ENDIF ENDIF ' PAUSE 500 GOTO mxxn noff: SEROUT Channel, Midibaud, [$b0, $7b, 0] onote = 0 bonote = 0 GOTO mxxn drumin: IF INL <> 0 THEN ' is a key pressed IF INL = 81 THEN GOTO noff anote = INL + lownote ' get the note IF anote <> onote THEN ' a new note SEROUT Channel, Midibaud, [Noteoff, onote, $7F,Noteon, anote, $7F] ', note + 3, $7F, note + 7, $7F ] ' play the note onote = anote ELSE ' not a new note ENDIF ELSE IF onote <> 0 THEN SEROUT Channel, Midibaud, [Noteoff, onote, $7F] ', note + 3, $7F, note + 7, $7F ] ' play the note onote = 0 ELSE ' no note playing ENDIF ENDIF AUXIO ' DEBUG DEC(INL), " " IF INL <> 0 THEN ' is a key pressed bnote = INL + hhhnote ' get the note IF bnote <> bonote THEN ' a new note MAINIO SEROUT Channel, Midibaud, [Noteoff, bonote, $7F, Noteon, bnote, $7F] ' play the note bonote = bnote ELSE ' not a new note ENDIF ELSE IF bonote <> 0 THEN MAINIO SEROUT Channel, Midibaud, [Noteoff, bonote, $7F] ' play the note bonote = 0 ELSE ' no note playing ENDIF ENDIF ' PAUSE 500 GOTO mxxn END