How to do it?
MUSIC FILE FORMAT v1.0
NOTE: need to do more research on what data we should include with samples. How does SNES/etc. do it?
Command Byte:
OR
Command Types:
; ============================================================================
; Simple test song: C-E-G-C chord progression
; ============================================================================
music_test_song:
; Header (16 bytes)
music_header:
.bytes "SD" ; Magic
.byte 1 ; Version
.byte 0 ; Flags
.word 250 ; Tempo: 250ms per row (240 BPM)
.byte 2 ; 2 instruments
.byte 2 ; 2 patterns
.byte 4 ; 4 orders (play pattern 0, 1, 0, 1)
.fill 7, 0 ; Reserved
; Instruments (8 bytes each)
music_instruments:
; Instrument 0: Lead (pulse wave)
.byte WAVE_PULSE ; Waveform
.byte $40 ; 50% duty
.byte $10 ; Attack
.byte $20 ; Decay
.byte $80 ; Sustain
.byte $40 ; Release
.byte $C0 ; Volume
.byte 0 ; Reserved
; Instrument 1: Bass (triangle)
.byte WAVE_TRIANGLE ; Waveform
.byte 0 ; Duty (ignored for triangle)
.byte $08 ; Attack
.byte $10 ; Decay
.byte $A0 ; Sustain
.byte $30 ; Release
.byte $FF ; Volume
.byte 0 ; Reserved
; Order list
music_orders:
.byte 0 ; Play pattern 0
.byte 1 ; Play pattern 1
.byte 0 ; Play pattern 0 again
.byte 1 ; Play pattern 1 again
.byte $FF ; End of song
; Patterns
music_patterns:
; Pattern 0 offset (for seeking)
music_pattern_0:
; Row 0: Channel 0 plays C4 with instrument 0
.byte $00, $31, $00 ; Ch0, Note On, C4, Inst 0
.byte $40, $19, $01 ; Ch1, Note On, C3, Inst 1 (bass)
.byte $FF ; End of row
; Row 1: Channel 0 plays E4
.byte $00, $35, $00 ; Ch0, Note On, E4, Inst 0
.byte $FF ; End of row
; Row 2: Channel 0 plays G4
.byte $00, $38, $00 ; Ch0, Note On, G4, Inst 0
.byte $FF ; End of row
; Row 3: Channel 0 plays C5
.byte $00, $3D, $00 ; Ch0, Note On, C5, Inst 0
.byte $FF ; End of row
.byte $FF ; End of pattern
music_pattern_1:
; Row 0: Note off on channel 0, bass plays G2
.byte $10 ; Ch0, Note Off
.byte $40, $14, $01 ; Ch1, Note On, G2, Inst 1
.byte $FF ; End of row
; Row 1: Channel 0 plays G4
.byte $00, $38, $00 ; Ch0, Note On, G4, Inst 0
.byte $FF ; End of row
; Row 2: Channel 0 plays B4
.byte $00, $3C, $00 ; Ch0, Note On, B4, Inst 0
.byte $FF ; End of row
; Row 3: Channel 0 plays D5
.byte $00, $3F, $00 ; Ch0, Note On, D5, Inst 0
.byte $FF ; End of row
.byte $FF ; End of pattern
music_end: