141e ;Simple sample player for MPU-401 MIDI interface ;Plays VOC samples triggered from MIDI in INCLUDELIB MPU INCLUDELIB INOUT INCLUDELIB SOUND INCLUDELIB FILE INCLUDE MPU.INC INCLUDE INOUT.INC INCLUDE SOUND.INC INCLUDE FILE.INC INCLUDE DOS.INC include wrbyte.inc DOSSEG .MODEL SMALL .STACK .DATA voc1fname db 'sp1.voc',0 voc2fname db 'sp2.voc',0 voc3fname db 'sp3.voc',0 voc4fname db 'sp4.voc',0 voc5fname db 'sp5.voc',0 voc6fname db 'sp6.voc',0 voc7fname db 'sp7.voc',0 voc8fname db 'sp8.voc',0 voc1seg dw 0 voc2seg dw 0 voc3seg dw 0 voc4seg dw 0 voc5seg dw 0 voc6seg dw 0 voc7seg dw 0 voc8seg dw 0 screentxt db 'Sample Player v1.0',13,10 db 13,10 db 'Receive Channel: ',13,10 db '$' .DATA? in_runstatus db ? channel db ? rcvchannel db ? program db ? note db ? velocity db ? ctrl db ? ctrlval db ? .CODE .STARTUP @ModBlock 65536/16 call init mainlp: call mpu_get jnc chk_key cmp al,NoteOff1 jb less_than_128 cmp al,EOX ja chk_key ;Ignore System Realtime Messages mov in_runstatus,al jmp chk_key less_than_128: mov dl,in_runstatus mov dh,dl and dh,0fh mov channel,dh cmp dl,NoteOn1 jb chk_progchange cmp dl,NoteOn16 ja chk_progchange mov note,al c1: call mpu_get jnc c1 cmp al,127 ;Ignore Non-data msgs ja c1 mov velocity,al mov dl,rcvchannel cmp dl,channel jnz chk_key cmp velocity,0 jz sample_off cmp note,60 jnz n61 mov es,voc1seg jmp cont n61: cmp note,61 jnz n62 mov es,voc2seg jmp cont n62: cmp note,62 jnz n63 mov es,voc3seg jmp cont n63: cmp note,63 jnz n64 mov es,voc4seg jmp cont n64: cmp note,64 jnz n65 mov es,voc5seg jmp cont n65: cmp note,65 jnz n66 mov es,voc6seg jmp cont n66: cmp note,66 jnz n67 mov es,voc7seg jmp cont n67: cmp note,67 jnz chk_key mov es,voc8seg cont: mov dx,es cmp dx,0 jz chk_key mov di,1ah call play_sample jmp chk_key sample_off: call stop_sample jmp chk_key chk_progchange: cmp dl,ProgramChange1 jb chk_ctrlchange cmp dl,ProgramChange16 ja chk_ctrlchange mov program,al jmp chk_key chk_ctrlchange: cmp dl,ControlChange1 jb chk_key cmp dl,ControlChange16 ja chk_key mov ctrl,al c2: call mpu_get jnc c2 cmp al,127 ;Ignore Non-data msgs ja c2 mov ctrlval,al chk_key: mov ah,01 int 16h jz mainlp mov ah,00 int 16h cmp al,'+' jz channel_up cmp al,'-' jz channel_dn cmp al,27 jz quit jmp mainlp channel_up: cmp rcvchannel,15 jz mainlp inc rcvchannel jmp chan_cont channel_dn: cmp rcvchannel,0 jz mainlp dec rcvchannel chan_cont: call write_channel jmp mainlp quit: call mpu_exit2 call exit_ctvoice call clrscr call showcur .EXIT init PROC call init_ctvoice call mpu_init2 call load_samples call clrscr call hidecur mov ah,9 mov dx,offset screentxt int 21h mov rcvchannel,0 call write_channel ret init ENDP midiout PROC push ax push dx mov databyte,al call mpu_put pop dx pop ax ret midiout ENDP wr_midibyte PROC push ax push dx mov dl,al Wr_Byte mov ah,2 mov dl,' ' int 21h pop dx pop ax ret wr_midibyte ENDP write_channel PROC mov dh,2 mov dl,17 call setcur xor dx,dx mov dl,rcvchannel add dl,1 call writedec mov ah,2 mov dl,' ' int 21h ret write_channel ENDP load_samples PROC mov dx,offset voc1fname call heap_load cmp ax,0 jz not_loaded1 mov voc1seg,ax not_loaded1: mov dx,offset voc2fname call heap_load cmp ax,0 jz not_loaded2 mov voc2seg,ax not_loaded2: mov dx,offset voc3fname call heap_load cmp ax,0 jz not_loaded3 mov voc3seg,ax not_loaded3: mov dx,offset voc4fname call heap_load cmp ax,0 jz not_loaded4 mov voc4seg,ax not_loaded4: mov dx,offset voc5fname call heap_load cmp ax,0 jz not_loaded5 mov voc5seg,ax not_loaded5: mov dx,offset voc6fname call heap_load cmp ax,0 jz not_loaded6 mov voc6seg,ax not_loaded6: mov dx,offset voc7fname call heap_load cmp ax,0 jz not_loaded7 mov voc7seg,ax not_loaded7: mov dx,offset voc8fname call heap_load cmp ax,0 jz not_loaded8 mov voc8seg,ax not_loaded8: ret load_samples ENDP free_samples PROC cmp voc1seg,0 jz not_free1 mov es,voc1seg @FreeBlock not_free1: cmp voc2seg,0 jz not_free2 mov es,voc2seg @FreeBlock not_free2: cmp voc3seg,0 jz not_free3 mov es,voc3seg @FreeBlock not_free3: cmp voc4seg,0 jz not_free4 mov es,voc4seg @FreeBlock not_free4: cmp voc5seg,0 jz not_free5 mov es,voc5seg @FreeBlock not_free5: cmp voc6seg,0 jz not_free6 mov es,voc6seg @FreeBlock not_free6: cmp voc7seg,0 jz not_free7 mov es,voc7seg @FreeBlock not_free7: cmp voc8seg,0 jz not_free8 mov es,voc8seg @FreeBlock not_free8: ret free_samples ENDP END . 0