home *** CD-ROM | disk | FTP | other *** search
- '
- ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
- ' Sequenzerprogramm mit Abspeichermöglichkeit als MIDI Standard File
- ' geschrieben in GFA-BASIC 3.5E D, (C)1993 Stephan M. Sprenger
- ' PROSONIQ PRODUCTS SOFTWARE, Badenwerkstraße 9, 76137 Karlsruhe
- ' .............................................................................
- '
- '
- $I+ ! Compiler-Option: Interrupts initialisieren
- $P> ! Compiler-Option: GFA-Konvention für Procedures
- '
- mtc!=FALSE ! Synchronisation: FALSE=intern, TRUE=MIDI Clock
- click|=1 ! Metronom: 1=Metronom an, 0=Metronom aus
- tempo#=0.01 ! Tempo: Aufzeichnungs- und Abspielgeschwindigkeit
- '
- @init ! Programm initialisieren
- @standby ! Hauptschleife des Programms
- '
- ' Unter-Routinen zum Programm
- '
- PROCEDURE init
- OPENW 0 ! Bildschirm und Fenster...
- DEFMOUSE 0
- TITLEW #1," SEQUENCER "
- INFOW #1," "
- OPENW #1,20,150,600,100,0
- CLS
- dm#=FRE(0)/15
- ' ## INLINE:
- ' $0000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0100: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0170: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0180: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0190: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $01a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $01b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $01c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $01d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $01e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $01f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0200: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0210: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0220: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0230: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0240: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0250: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0260: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0270: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0280: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0290: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $02a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $02b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $02c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $02d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $02e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $02f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0300: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0310: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0320: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0330: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0340: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0350: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0360: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0370: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0380: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0390: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $03a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $03b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $03c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $03d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $03e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $03f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0400: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0410: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0420: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0430: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0440: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0450: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0460: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0470: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0480: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0490: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $04a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $04b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $04c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $04d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $04e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $04f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0510: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0520: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0530: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0540: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0550: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0560: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0570: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0580: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0590: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $05a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $05b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $05c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $05d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $05e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $05f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0610: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0620: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0630: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0640: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0650: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0660: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0670: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0680: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0690: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $06a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $06b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $06c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $06d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $06e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $06f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0700: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0710: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0720: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0730: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0740: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0750: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0760: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0770: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0780: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0790: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $07a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $07b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $07c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $07d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $07e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $07f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0810: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0820: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0830: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0840: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0850: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0860: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0870: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0880: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0890: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $08a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $08b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $08c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $08d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $08e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $08f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0900: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0910: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0920: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0930: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0940: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0950: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0960: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0970: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0980: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0990: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $09a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $09b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $09c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $09d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $09e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $09f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0a00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0a10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0a20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0a30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0a40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0a50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0a60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0a70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0a80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0a90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0aa0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0ab0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0ac0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0ad0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0ae0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0af0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0b00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0b10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0b20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0b30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0b40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0b50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0b60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0b70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0b80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0b90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0ba0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0bb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0bc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0bd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0be0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0bf0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0c00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0c10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0c20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0c30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0c40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0c50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0c60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0c70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0c80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0c90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0ca0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0cb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0cc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0cd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0ce0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0cf0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0d00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0d10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0d20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0d30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0d40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0d50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0d60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0d70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0d80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0d90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0da0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0db0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0dc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0dd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0de0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0df0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0e00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0e10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0e20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0e30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0e40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0e50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0e60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0e70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0e80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0e90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0ea0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0eb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0ec0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0ed0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0ee0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0ef0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0f00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0f10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0f20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0f30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0f40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0f50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0f60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0f70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0f80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' $0f90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
- ' 4000 Bytes.
- INLINE midi_buffer%,4000
- @midi_buffer(midi_buffer%,4000) ! neuen System-MIDI-Puffer einrichten
- ON BREAK GOSUB alter_buffer ! alten Puffer bei Abbruch wiederherstellen
- ON ERROR GOSUB alter_buffer ! alten Puffer bei Fehler restaurieren
- DIM dat$(dm#) ! Feld für MIDI-Daten
- DIM time%(dm#) ! Feld für Absolutzeit
- DIM d_len&(300)
- OPEN "O",#99,"MID:" ! MIDI-Schnittstelle öffnen
- RETURN
- '
- PROCEDURE standby
- DO
- INFOW #1," Status: Stand-By "+fn$
- PRINT AT(13,2),"BAR: ";1''''" BEAT: ";1'''
- key$=CHR$(INP(2))
- IF key$="0"
- INFOW #1," Status: Playback ... "+fn$
- @playback
- ELSE IF key$="*"
- INFOW #1," Status: Recording ... "+fn$
- @record
- ELSE IF key$=CHR$(27)
- @alter_buffer
- ELSE IF key$="s" OR key$="S"
- INFOW #1," Status: Saving MIDI Standard File ... "+fn$
- @convert_mid(1,1)
- ELSE IF key$="l" OR key$="L"
- INFOW #1," Status: Loading MIDI Standard File ... "+fn$
- @convert_mid(1,0)
- ELSE IF INKEY$=CHR$(13)
- @all_notes_off
- ELSE
- CLR key$
- ENDIF
- LOOP
- RETURN
- '
- PROCEDURE record
- tm#=0
- c%=1
- VOID FRE(0)
- dummy$=INPMID$ ! MIDI-In-Puffer leeren ...
- @anzeige
- DO
- IF mtc!=FALSE ! interne Synchronisation?
- DELAY tempo# ! Ja, dann Pause und...
- INC tm# ! ... Zähler erhöhen
- @anzeige ! Position anzeigen...
- ENDIF
- IF INP?(3) ! MIDI-Daten liegen an?
- in|=INP(3) ! Ja, dann lesen
- IF in|>127 ! Statusbyte ?
- IF (in| AND &HF0)=144 ! Note-On ?
- rb|=in| ! Statusbyte puffern
- @get ! und Event aufzeichnen
- ELSE IF (in| AND &HF0)=128 ! Note-Off ?
- rb|=in| ! Statusbyte puffern
- @get ! und Event aufzeichnen
- ELSE IF in|=248 AND mtc!=TRUE ! MIDI-Clock-Signal?
- INC tm# ! Ja, dann Zähler erhöhen
- @anzeige ! Position anzeigen...
- ELSE
- rb|=0 ! andere Daten außer Noten ignorieren
- ENDIF
- ELSE
- IF rb|<>0 ! Letztes Statusbyte war Note-On/Off?
- dat$(c%)=CHR$(rb|)+CHR$(in|)+CHR$(INP(3)) ! dann Byte speichern
- time%(c%)=tm# ! Zeit speichern
- INC c% ! Zähler erhöhen
- ENDIF
- ENDIF
- ELSE
- in|=0
- ENDIF
- last%=c% ! Variable für Spur-Ende
- EXIT IF c%=>dm#-1 OR INKEY$=CHR$(13)
- LOOP
- RETURN
- '
- PROCEDURE playback
- tm#=0
- c%=1
- VOID FRE(0)
- dummy$=INPMID$ ! MIDI-In-Puffer leeren ...
- DO ! Wiedergabe-Schleife
- IF INP?(3)
- in|=INP(3)
- ELSE
- in|=0
- ENDIF
- IF in|=248 AND mtc!=TRUE ! MIDI-Clock?
- INC tm# ! Dann Uhr +1
- @anzeige
- ENDIF
- IF mtc!=FALSE ! Interne Synchronisation?
- DELAY tempo# ! Dann Uhr nach Pause +1
- INC tm#
- @anzeige
- ENDIF
- IF time%(c%)<=tm# ! nächstes Event schon dran?
- PRINT #99,dat$(c%); ! Ja, dann ausgeben
- INC c%
- ENDIF
- EXIT IF c%=>dm#-1 OR c%=>last% OR INKEY$=CHR$(13)
- LOOP
- @all_notes_off ! Nach Beendigung alle Noten aus.
- RETURN
- '
- PROCEDURE get
- dat$(c%)=CHR$(rb|)+CHR$(INP(3))+CHR$(INP(3)) ! Byte speichern
- time%(c%)=tm# ! Zeit speichern
- INC c% ! Zähler erhöhen
- RETURN
- '
- PROCEDURE anzeige
- IF tm# MOD 24=0 ! Anzeige von Takt und Viertel
- PRINT AT(13,2),"BAR: ";TRUNC(tm#/96)+1''''" BEAT: ";((tm#/24) MOD 4)+1'''
- PRINT CHR$(7*click|);
- ENDIF
- RETURN
- '
- PROCEDURE ende
- CLOSEW 1
- CLOSEW 0
- CLOSE
- EDIT
- RETURN
- '
- PROCEDURE convert_mid(abs_rel|,save_load|)
- '
- ' speichert/lädt Daten als MIDI Standard File:
- ' MIDI-Events in dat$(), Zeit als Clicks in time%()
- '
- ' Wenn Sie abs_rel| auf 1 setzen, erwartet die Routine in time%() die
- ' Zeitangabe als Absolutzeit (also als Zeit seit Spuranfang); ist
- ' abs_rel| Null, dann erwartet die Routine in time%() die seit dem
- ' vorhergehenden Event verstrichene Zeit.
- '
- ' In dat$() befinden sich die zu speichernden MIDI-Events; diese müssen
- ' pro Eintrag vollständig sein (ein Note-On liegt hier z.B. als
- ' dat$(2)=CHR$(144)+CHR$(60)+CHR$(64) vor).
- '
- ' Wenn save_load|=1 ist wird gespeichert, bei save_load|=0 wird geladen
- '
- @convert_init ! Konvertierungsroutine einrichten
- dummy$=INKEY$
- FILESELECT "A:\*.MID","MIDIFILE.MID",fn$
- DEFMOUSE 2
- IF fn$="" OR fn$="\"
- GOTO cancel
- ENDIF
- IF save_load|=1
- OPEN "O",#1,fn$
- PRINT #1,"MThd"; ! **** Header-Block-Kennung ****
- PRINT #1,MKL$(6); ! Länge des Headers
- PRINT #1,MKI$(0); ! File Format (0)
- PRINT #1,MKI$(1); ! Anzahl der Spuren
- PRINT #1,MKI$(&H18); ! 24 Clicks pro Viertelnote (MIDI Clock)
- PRINT #1,"MTrk"; ! ***** Spur-Block-Kennung *****
- PRINT #1,MKL$(0); ! Platzhalter für Blocklänge
- PRINT #1,CHR$(0); ! Delta-Time des ersten Events
- PRINT #1,CHR$(&HFF); ! Meta-Event: Spurname
- PRINT #1,MKI$(&H108); ! (01=Text, 08=Textlänge)
- PRINT #1,"MIDIFILE"; ! Spurname
- c%=0
- DO
- INC c%
- VOID FRE(0)
- r%=V:r$
- IF abs_rel|=1 ! time%() enthält Absolutzeit
- LPOKE r%+6,(time%(c%)-time%(c%-1)) ! Zeit zwischen zwei Events
- ELSE
- LPOKE r%+6,time%(c%) ! time%() enthält Delta-Time
- ENDIF
- POKE r%+2,1 ! Opcode: 1=DEZ-->VLN, 0=VLN-->DEZ
- d0#=C:r%() ! VLN-Routine aufrufen
- FOR b|=0 TO 3 ! Bytes in Datei schreiben...
- IF PEEK(r%+6+b|)<>0
- PRINT #1,CHR$(PEEK(r%+6+b|));
- ENDIF
- NEXT b|
- PRINT #1,dat$(c%); ! MIDI-Daten in Datei ausgeben
- EXIT IF c%=last% ! Abbrechen wenn Spurende
- LOOP
- PRINT #1,CHR$(0); ! Delta-time% zum Spurende
- PRINT #1,CHR$(&HFF);MKI$(&H2F00); ! Meta-Event: Spurende
- CLOSE #1
- OPEN "U",#1,fn$ ! Datei nochmals öffnen
- l%=LOF(#1) ! Länge ermitteln
- SEEK #1,18 ! Byte #18 anfahren
- PRINT #1,MKL$(l%-18); ! Spurlänge eintragen
- ELSE
- c%=0 ! Zähler für Feldindex
- z%=0 ! Zähler für Absolutzeit
- b%=0 ! Zähler für gelesene Bytes
- evt$=""
- OPEN "I",#1,fn$ ! Datei zum Lesen öffnen
- id$=INPUT$(4,#1) ! Header-ID lesen
- h_l%=CVL(INPUT$(4,#1)) ! Header-Länge lesen
- ff&=CVI(INPUT$(2,#1)) ! File-Typ lesen
- anz&=CVI(INPUT$(2,#1)) ! Spuranzahl
- res&=CVI(INPUT$(2,#1)) ! Auflösung
- IF id$<>"MThd" OR ff%<>0 ! MIDI-File vom Typ 0?
- ALERT 3,"Ungültiges Fileformat - |Fileheader",1," OK ",r#
- GOTO cancel ! Nein, dann Abbruch
- ENDIF
- id$=INPUT$(4,#1) ! Track-ID lesen
- b_l%=CVL(INPUT$(4,#1)) ! Länge der Spur
- IF id$<>"MTrk" ! Track-ID prüfen
- ALERT 3,"Ungültiges Fileformat - |Trackstruktur",1," OK ",r#
- GOTO cancel ! Ungültig? dann raus
- ENDIF
- DO ! Leseschleife
- INC c% ! Zähler für Feld erhöhen
- t$=""
- DO ! Leseschleife für Zeit
- tim$=INPUT$(1,#1) ! Erstes Byte lesen
- INC b% ! Bytezähler +1
- t$=t$+tim$ ! ersten Zeitwert bilden
- EXIT IF ASC(tim$)<128 ! raus, wenn LSB gelesen
- LOOP
- VOID FRE(0)
- t$=MID$(t$,1,4)
- t$=STRING$(4-LEN(t$),0)+t$ ! Langwort bilden
- r%=V:r$ ! Adresse der Maschinenroutine
- POKE r%+2,0 ! Opcode: 0=VLN-->DEZ
- LPOKE r%+6,CVL(t$) ! Wert übergeben
- d0#=C:r%() ! Maschinenprogramm aufrufen
- IF abs_rel|=0 ! Relative Zeit benötigt?
- time%(c%)=LPEEK(r%+6)/(res&/24) ! dann Delta-Time ablegen
- ELSE ! Absolutzeit?
- z%=z%+LPEEK(r%+6) ! dann Zeit bilden...
- time%(c%)=z%/(res&/24) ! ...und in interne Auflösung umrechnen
- ENDIF
- evt$=INPUT$(1,#1) ! Event, erstes Byte lesen
- INC b% ! wieder ein Byte mehr...
- rb|=(ASC(evt$)) AND &HF0 ! nur Hi-Nibble wird benötigt
- IF d_len&(rb|)=0 ! Event-Typ ist nicht bekannt?
- ALERT 3,"ERROR:|Unbekanntes MIDI-Event",1,"CANCEL",r#
- EXIT IF r#=1 ! dann nix wie raus...
- ENDIF
- IF evt$=CHR$(&HFF) ! Event ist Meta-Event...
- m_type&=ASC(INPUT$(1,#1)) ! ...dann Event-Typ feststellen
- m_l&=ASC(INPUT$(1,#1)) ! Länge feststellen
- RELSEEK #1,m_l& ! Meta-Event ignorieren...
- b%=b%+m_l&+2 ! ...und überspringen
- EXIT IF m_type&=&H2F ! raus wenn Meta-Event = Spurende
- ELSE
- dat$(c%)=evt$+INPUT$(d_len&(rb|)-1,#1) ! wenn normales MIDI-Event...
- b%=b%+d_len&(rb|) ! ... dann lesen und speichern
- ENDIF
- LOOP
- last%=c% ! Spurende
- ENDIF
- cancel:
- CLOSE #1 ! Datei schließen
- DEFMOUSE 0 ! Biene wegzaubern
- RETURN
- '
- PROCEDURE convert_init
- '
- ' Initialisierung der VLN/Dezimal-Routine.
- ' Die in r$ abgelegte Maschinenroutine erwartet in V:r$+2 als Byte den
- ' Opcode der auszuführenden Berechnung (0=VLN in Dezimalwert umrechnen,
- ' 1=Dezimalwert in VLN umrechnen) und in V:r$+6 den umzurechnenden Wert.
- ' Nach Aufruf der Routine kann von dort auch der berechnete Wert gelesen
- ' werden (Langwort). Die Wertübergabe über die Speicherstelle habe ich
- ' gewählt, weil die Übergabe über den Stack bei meiner GFA-Version nicht
- ' korrekt funktioniert.
- '
- r$=MKL$(&H60080000)+MKL$(0)+MKL$(&H41FA)+MKL$(&HFFF62228)
- r$=r$+MKL$(&H44A10)+MKL$(&H6754B2BC)+MKL$(&HFFFFFFF)+MKL$(&H62407003)
- r$=r$+MKL$(&HE389E209)+MKL$(&H8810007)+MKL$(&HB07C0003)+MKL$(&H67084A01)
- r$=r$+MKL$(&H670408C1)+MKL$(&H71401)+MKL$(&HE09AE089)+MKL$(&H51C8FFE2)
- r$=r$+MKL$(&H8020017)+MKL$(&H670408C2)+MKL$(&HF0802)+MKL$(&H1F6706)
- r$=r$+MKL$(&H820080)+MKL$(&H80002142)+MKL$(&H47000)+MKL$(&H4E75217C)
- r$=r$+MKL$(&HFFFFFFF7)+MKL$(&H470FF)+MKL$(&H4E75B2BC)+MKL$(&HFFFFFFF7)
- r$=r$+MKL$(&H62167003)+MKL$(&H1401EE9A)+MKL$(&HE08951C8)+MKL$(&HFFF8E89A)
- r$=r$+MKL$(&H2820FFF)+MKL$(&HFFFF60CE)+MKL$(&H217C0FFF)+MKL$(&HFFFF0004)
- r$=r$+MKL$(&H70FF4E75)
- '
- '
- d_len&(128)=3 ! Note-Off,Befehlslänge 3 Bytes
- d_len&(144)=3 ! Note-On, Befehlslänge 3 Bytes
- d_len&(160)=3 ! Poly Pressure
- d_len&(176)=3 ! Control Change
- d_len&(192)=2 ! Program Change
- d_len&(208)=2 ! Channel Pressure
- d_len&(224)=3 ! Pitch Wheel Change
- d_len&(&HF0)=&HFF ! Meta-Event darf keinen Fehler erzeugen
- '
- ' Es können hier weitere Befehlslängen für MIDI-Nachrichten eingetragen werden
- '
- RETURN
- '
- PROCEDURE midi_buffer(neue_adresse%,laenge%)
- adresse%=XBIOS(14,2)
- alte_buffer_adresse%=LPEEK(adresse%)
- SLPOKE adresse%+6,0
- SLPOKE adresse%,neue_adresse%
- SDPOKE adresse%+4,laenge%
- RETURN
- '
- PROCEDURE alter_buffer
- adresse%=XBIOS(14,2)
- SLPOKE adresse%,alte_buffer_adresse%
- alte_buffer_adresse%=0
- alter_buffer%=0
- @ende ! Programm verlassen
- RETURN
- '
- PROCEDURE all_notes_off
- FOR chan|=0 TO 15 ! Alle Kanäle durchgehen...
- FOR note|=0 TO 127 ! Alle Noten durchgehen...
- IF note|=0 ! Erstes Note-Off normal..
- OUT 3,128+chan|
- ENDIF
- OUT 3,note|,0 ! ..den Rest im Running-Mode
- NEXT note| ! senden (geht schneller)
- NEXT chan|
- RETURN
-