; *************************************************************************** ; * MIDI Velocity Changer Version 1.1 * ; *************************************************************************** ; Das Korg RK100 Remote Keyboard sendet grundsaetzlich mit halber Anschlagstaerke. ; Viele Sounds klingen besser bei voller Anschlagstaerke. ; Diese Software veraendert die Velocity auf Maximum, 3/4 oder 1/2. ; Falls unerwuenscht kann Active Sensing ausgefiltert werden. ; Version vom 09.04.2007 fuer AT89C2051 ; Aenderungen: V1.0 - oeffentliche Erstversion ; V1.1 - Bug in der Abarbeitung Active Sensing beseitigt ; Entwicklungsvorgaben ; ==================== ; Funktion Status Label ; -------- ------ ----- ; RAM initialisieren----------Fertig..................raminit ; MIDI initialisieren---------Fertig, serieller Interrupt gesperrt ; Stack festlegen-------------Fertig, fliessend oberhalb Variable ; Registerbank festlegen------Fertig, Bank 0 ; Hauptschleife---------------Fertig..................haupt ; ----------------------------------------------------------------------------- ; Gefilterte MIDI-Befehle: ; ------------------------ ; NOTE ON 90 kk 40 ; --> 90 kk 40 Velocity 64 ; --> 90 kk 60 Velocity 96 ; --> 90 kk 7F Velocity 127 (default) ; ACTIVE SENSING FE On (default) / Off ; ----------------------------------------------------------------------------- ; P1.0 P3.0 -RxD R0 ; P1.1 P3.1 -TxD R1 ; P1.2 Active Sensing Off P3.2 R2 ; P1.3 Velocity 96 P3.3 R3 ; P1.4 Velocity 64 P3.4 R4 ; P1.5 P3.5 R5 ; P1.6 R6 ; P1.7 P3.7 R7 ; ------Variablen Internes RAM, unter-/innerhalb BITFELD ---------------------- ; Variablen unterhalb Bit-Bereich m_buf equ 008h ; Puffer fuer empfangenes Byte ; Variablen innerhalb Bit-Bereich status equ 020h ; Puffer fuer empfangenes Byte stack equ 021h ; Rest fuer Stack reservieren ; status Bitkodierung ; status.0 Flag fuer Running Status ; status.1 Flag Data Byte org 000h ; ROM-Bereich ; ----- Interruptbereich ------------------------------------------------------ reset ljmp start ; normaler Systemstart reti ; keine Interruptroutinen vorhanden ds 7 reti ds 7 reti ds 7 reti ds 7 reti ; ----- Programm-Info --------------------------------------------------------- db "+++" db " MIDI Velocity Changer 1.1 / AT89C2051 / (C) Stoffel 04/2007 " db "+++" ; ----- Stack einrichten / Registerbank festlegen ----------------------------- start mov SP,#stack ; Stack einrichten clr PSW.3 ; Registerbank 0 clr PSW.4 ; ----- Serielle Schnittstelle initialisieren --------------------------------- mov TMOD,#00100000b ; Timer 1 Baudrate, Timer 2 aus mov TCON,#01000000b ; Timer 1 laeuft... mov TH1,#0FFh ; Timer 1 Reload fuer Baudrate 31250 mov SCON,#01111100b ; Init. serielle Schnittstelle mov IE,#00000000b ; alle Interrupt verbieten ; ----- Register initialisieren ----------------------------------------------- raminit mov status,#0d ; Flags loeschen ; ----- MIDI zulassen --------------------------------------------------------- clr SCON.0 ; RI loeschen clr SCON.1 ; TI loeschen ; ----- Hauptschleife --------------------------------------------------------- haupt jnb SCON.0,haupt ; Byte empfangen? clr SCON.0 ; dann IRQ loeschen mov m_buf,SBUF ; dann Byte in Puffer sichern mov A,m_buf ; Byte aus Puffer holen act_sens cjne A,#0FEh,realtime ; Active Sensing? jnb P1.2,haupt ; und Active Sensing ist nicht abgeschaltet? sjmp send ; dann Byte senden realtime anl A,#0F8h ; Bit 0 - 3 ausblenden cjne A,#0F8h,haupt0 ; MIDI Real Time Befehl? sjmp send ; dann Byte senden haupt0 mov A,m_buf ; Byte aus Puffer holen cjne A,#090h,haupt1 ; Status Note On empfangen? setb status.0 ; dann Flag Running Status setzen clr status.1 ; Flag Data Byte loeschen sjmp send ; und Byte senden haupt1 jnb ACC.7,haupt2 ; anderes Statusbyte empfangen? clr status.0 ; dann Flag Running Status loeschen sjmp send ; und Byte senden haupt2 jb status.0,haupt3 ; Running Status fuer Note On inaktiv? sjmp send ; dann Byte senden haupt3 jb status.1,haupt4 ; Note No. erwartet? setb status.1 ; dann Flag Data Byte setzen sjmp send ; und Byte senden haupt4 mov A,m_buf jz haupt5 ; Velocity 1 oder groesser empfangen? jb P1.3,vel64 ; eingestellte Velocity 96? mov m_buf,#96d ; dann durch Velocity 96 ersetzen sjmp haupt5 ; und Byte senden vel64 jb P1.4,vel127 ; eingestellte Velocity 64? mov m_buf,#64d ; dann durch Velocity 64 ersetzen sjmp haupt5 ; und Byte senden vel127 mov m_buf,#127d ; sonst durch Velocity 127 ersetzen haupt5 clr status.1 ; und Flag Data Byte loeschen send mov SBUF,m_buf ; gepuffertes Byte senden send1 jnb SCON.1,send1 ; Sendevorgang abgeschlossen? clr SCON.1 ; dann IRQ loeschen sjmp haupt ; und von vorn end