Differences
This shows you the differences between two versions of the page.
ff3:ff3us:doc:asm:ram:sound_music_ram [2016/03/12 22:47] everything created |
ff3:ff3us:doc:asm:ram:sound_music_ram [2019/02/12 10:04] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Sound/Music RAM ====== | ||
- | |||
- | This is a list of the RAM locations used by the sound/music program. The code that uses this data is in bank C5. This page also lists RAM locations used by the SPC-700 sound chip. | ||
- | |||
- | ==== $1300-$1400: | ||
- | |||
- | $1300 SPC Command (byte 0) | ||
- | $1301 SPC Command (byte 1) | ||
- | $1302 SPC Command (byte 2) | ||
- | $1303 SPC Command (byte 3) | ||
- | $1304 Current Song Command (byte 0) | ||
- | $1305 Current Song Command (byte 1) | ||
- | $1306 Current Song Command (byte 2) | ||
- | $1307 Current Song Command (byte 3) | ||
- | $1308 Previous Song Command (byte 0) | ||
- | $1309 Previous Song Command (byte 1) | ||
- | $130A Previous Song Command (byte 2) | ||
- | $130B Previous Song Command (byte 3) | ||
- | | ||
- | ++$1310 Pointer to instrument brr data | ||
- | | ||
- | |||
- | ===== SPC-700 RAM Map ===== | ||
- | |||
- | ==== $0000-$00FF: | ||
- | |||
- | +$00 Song Script Offset | ||
- | +$02 Song Script Pointer (2 bytes per voice) | ||
- | +$12 Sound Effect Song Script Pointer (2 bytes per voice) | ||
- | $22 Key On (bitmask) -> DSP $4C | ||
- | $23 Key On (for paused song, bitmask) | ||
- | $24 Key Off (bitmask) -> DSP $5C (set when note duration counter is $02) | ||
- | $25 Note Duration Counter | ||
- | $26 Pointer to Loop Count (+$F920/ | ||
- | $35 Voice Duration Counter (sound effect) | ||
- | $36 Pointer to Loop Count (sound effect, +$F920/ | ||
- | +$45 Current Tempo in beats per minute (high byte active) | ||
- | $47 Tempo Counter | ||
- | $48 Sound Effect Tempo Counter (always 120) | ||
- | $49 Tempo Envelope Counter | ||
- | +$4A Tempo Envelope Change Rate | ||
- | +$4C Echo Volume (high byte active) -> DSP $2C & $3C | ||
- | +$4E Echo Volume Envelope Change Rate | ||
- | $50 Echo Volume Envelope Counter | ||
- | $51 Song Volume | ||
- | $52 Enabled Voices (bitmask, cleared if voice has no song script) | ||
- | $53 Enable Echo (bitmask) | ||
- | $54 Enable Echo (bitmask, sound effect) | ||
- | $55 Enable Noise (bitmask) | ||
- | $56 Enable Noise (bitmask, sound effect) | ||
- | $57 Enable Pitch Mod (bitmask) | ||
- | $58 Enable Pitch Mod (bitmask, sound effect) | ||
- | $59 Disable Key Off at End of Note (bitmask, used for ties, slurs, and drum rolls) | ||
- | $5A Disable Key Off at End of Note (bitmask, sound effect) | ||
- | $5B Enable Slur (bitmask, set before first slurred note) | ||
- | $5C Enable Slur (bitmask, sound effect) | ||
- | $5D Activate Slur (bitmask, set after first slurred note) | ||
- | $5E Activate Slur (bitmask, sound effect) | ||
- | $5F Enable Drum Roll (bitmask, disables key off at end of note) | ||
- | $60 Enable Drum Roll (bitmask, sound effect) | ||
- | $61 Ignore Song Volume (bitmask) | ||
- | $62 Noise Clock Value | ||
- | $63 Noise Clock Value (sound effect) | ||
- | $64 - | ||
- | $65-$74 Filter Data (8 values, 2 bytes each, high bytes active) -> DSP $0F-$7F | ||
- | +$75 Echo Feedback (signed, high byte active) -> DSP $0D | ||
- | $77 Filter Envelope Counter | ||
- | $78 Echo Feedback Envelope Counter | ||
- | +$79 Echo Feedback Envelope Change Rate | ||
- | $7B Output Code | ||
- | $7C - | ||
- | $7D - | ||
- | $7E - | ||
- | $7F - | ||
- | $80 new echo delay value | ||
- | $81 echo buffer wait time | ||
- | $82 - | ||
- | $83 Game Sound effect (type 2) voices (bitmask) | ||
- | $84 System sound effect (type 1) voices (bitmask) | ||
- | $85 ----v??m | ||
- | v: enable master volume envelope output mode (interrupt command $80/$81) | ||
- | m: enable mono mode (interrupt command $F3) | ||
- | $86 weft---- | ||
- | w: enable waveform output mode (interrupt command $FF/$01) | ||
- | e: disable echo (interrupt command $FF/$02) | ||
- | f: fast forward | ||
- | t: update first/last 4 voices for waveform output mode (toggles every frame) | ||
- | $87 Enable Echo (bitmask) -> DSP $4D | ||
- | $88 Enable Noise (bitmask) -> DSP $3D | ||
- | $89 Enable Pitch Mod (bitmask) -> DSP $2D | ||
- | $8A DSP Flags -> DSP $6C | ||
- | rmennnnn | ||
- | r: DSP reset | ||
- | m: mute all | ||
- | e: echo disable | ||
- | n: noise generator frequency | ||
- | $8B-$93 scratchpad | ||
- | $8B interrupt command b0 | ||
- | $8C interrupt command b1 | ||
- | $8D interrupt command b2 | ||
- | $8E interrupt command b3 | ||
- | $8F bitmask for current voice | ||
- | |||
- | $98-$9B scratchpad | ||
- | | ||
- | $A0 Active Voices | ||
- | $A1 current octave | ||
- | $A2 Current Op Code/Note | ||
- | $A3 Voice Pointer | ||
- | $A4 Muted Voices (bitmask) | ||
- | | ||
- | $A5-$BF Master Envelope Data (counters decrement every 39ms, 25.64 Hz) | ||
- | ------- | ||
- | +$A5 Master Volume (high byte active) | ||
- | +$A7 Sound Effect Volume (high byte active, affects game sound effects only) | ||
- | +$A9 Master volume envelope change rate | ||
- | +$AB Sound Effect volume envelop change rate | ||
- | $AD Master volume envelope counter | ||
- | $AE - | ||
- | $AF Sound effect volume envelope counter | ||
- | $B0 - | ||
- | +$B1 Sound Effect Pan (high byte active) | ||
- | +$B3 Sound Effect Pan envelope change rate | ||
- | $B5 Sound Effect Pan envelope counter | ||
- | +$B7 Tempo Ratio (interrupt command $84, high byte active) | ||
- | +$B8 Tempo Ratio Envelope Change Rate | ||
- | $BA Tempo Ratio Envelope Counter | ||
- | +$BB Master Pitch Multiplier (high byte active) | ||
- | +$BD Master Pitch Multiplier envelope change rate | ||
- | $BF Master Pitch Multiplier envelope counter | ||
- | |||
- | $C0-$C3 Pitch Calculation Data | ||
- | ------- | ||
- | +$C0 Calculated Frequency Value | ||
- | +$C2 Note Pitch Multiplier | ||
- | $C3 | ||
- | $C4 Pointer to Song Start Offsets (+$1C02) | ||
- | $C6 Paused Song Index | ||
- | $C7 Current Song Index | ||
- | $C8 Master Envelope Frame Counter (8 * 4.875 milliseconds, | ||
- | $C9-$D8 Calculated volume for each voice (2 bytes each, left then right, used for waveform output mode) | ||
- | $D9 Paused Voices (bitmask) | ||
- | $DA Paused Game Sound Effects (bitmask) | ||
- | $DB Enable volume update in DSP (bitmask) | ||
- | $DC Enable pitch update in DSP (bitmask) | ||
- | $DD Enable Conditional Jump (bitmask) | ||
- | $DE-$EF - | ||
- | | ||
- | $F0-$FF Hardware Registers | ||
- | ------- | ||
- | $F0 (test) | ||
- | $F1 --ab-xyz | ||
- | a: clear port-0 and port-1 | ||
- | b: clear port-2 and port-3 | ||
- | x: start timer-0 | ||
- | y: start timer-1 | ||
- | z: start timer-2 | ||
- | $F2 DSP Address | ||
- | $F3 DSP Data | ||
- | $F4 Port-0 | ||
- | $F5 Port-1 | ||
- | $F6 Port-2 | ||
- | $F7 Port-3 | ||
- | $F8 - | ||
- | $F9 - | ||
- | $FA Timer-0 | ||
- | $FB Timer-1 | ||
- | $FC Timer-2 | ||
- | $FD Counter-0 (4.875 milliseconds) | ||
- | $FE Counter-1 (16 milliseconds) | ||
- | $FF Counter-2 (78.125 microseconds) | ||
- | |||
- | ==== $0100-$01FF: | ||
- | |||
- | $00-$0F Filter Envelope Change Rate | ||
- | $10 Vibrato Delay (in ticks) | ||
- | $11 Vibrato Delay Counter | ||
- | $30 Tremolo Delay (in ticks) | ||
- | $31 Tremolo Delay Counter | ||
- | $50 Pitch Envelope Target (signed, in half steps, clears when a new note is played) | ||
- | $51 Vibrato Amplitude (unsigned fraction, low 6 bits active) | ||
- | $70 mmaaaaaa | ||
- | m: tremolo mode (0/1 = positive, 2 = negative, 3 = balanced) | ||
- | a: tremolo amplitude (unsigned fraction, low 6 bits active) | ||
- | $71 (pansweep) | ||
- | $90 -ttt-vvv | ||
- | t: tremolo gain counter (doesn' | ||
- | v: vibrato gain counter (linear envelope lasting 4 cycles when vibrato begins, unused if vibrato delay is 0) | ||
- | $91 - | ||
- | $B0-$FF CPU Stack | ||
- | | ||
- | ==== $0200-$19FF: | ||
- | |||
- | $178F-$17A8 Note Pitch Multipliers ($1000 * 2 ^ ((x - 12) / 12)) | ||
- | $17A9-$17D0 Filter Data (8 bytes each) | ||
- | $17D1-$17DE Note Durations | ||
- | $17DF-$17FE Pointers to System Sound Effect Scripts | ||
- | $17FF-$1880 System Sound Effect Data | ||
- | $1881-$18F8 Jump Table for Op Codes | ||
- | $18F9-$1934 Number of Bytes for each Op Code | ||
- | $1935-$1954 Jump Table for Interrupts $10-$1F | ||
- | $1955-$1974 Jump Table for Interrupts $80-$8F | ||
- | $1975-$1994 Jump Table for Interrupts $F0-$FF | ||
- | $1995-$19A5 Pointers to DSP Registers | ||
- | $19A6-$19B6 Pointers to DSP Data in dp 0 | ||
- | $19B7-$19FF - | ||
- | | ||
- | ==== $1A00-$F5FF: | ||
- | |||
- | $1A00-$1A7F Instrument Pitch Multipliers (2 bytes each, high byte then low byte) | ||
- | $1A80-$1AFF ADSR Data (2 bytes each, gdddaaa then sssrrrrr) | ||
- | $1B00-$1BFF Pointers to BRR Waveform Data (4 bytes each, start then loop start) | ||
- | $1C00-$2BFF Song Scripts | ||
- | $2C00-$2FFF Pointers to Game Sound Effects (4 bytes each, voice A then voice B) | ||
- | $3000-$47FF Game Sound Effect Data | ||
- | $4800-$7CFF BRR Data | ||
- | $7D00-$F5FF Echo Buffer (assuming max echo delay value of 15, 240ms) | ||
- | | ||
- | ==== $F600-$FFBF: | ||
- | |||
- | $F600 Octave | ||
- | $F601 Instrument | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | $F6A0 Volume Envelope Counter (crescendo/ | ||
- | $F6A1 Pan Envelope Counter (panslide) | ||
- | $F6C0 Vibrato Cycle Duration (wave period = 4.875ms * this value * 2) | ||
- | $F6C1 Vibrato Cycle Counter | ||
- | $F6E0 Tremolo Cycle Duration | ||
- | $F6E1 Tremolo Cycle Counter | ||
- | $F700 (pansweep) | ||
- | $F701 (pansweep) | ||
- | $F720 Pitch Envelope Duration | ||
- | $F721 Transpose (in half steps, signed) | ||
- | | ||
- | $F760 Detune | ||
- | $F761 Absolute Pitch | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | | ||
- | $F920 Repeat Count (8 voices, 4 bytes per voice, counts up) | ||
- | $F940 Loop Counter (16 voices, 4 bytes per voice, counts down) | ||
- | | ||
- | $FA00-$FDFF Voice Data for Paused Song | ||
- | $FE00-$FEFF Saved dp 0 (first $80 bytes) | ||
- | $FF00-$FF9F Saved dp 1 (first $A0 bytes) | ||
- | |||
- | ==== $FFC0-$FFFF: | ||
- | |||
- | ===== Other SPC Data ===== | ||
- | |||
- | ==== Note Lengths ==== | ||
- | |||
- | 0: Whole Note C0 | ||
- | 1: Half Note 60 | ||
- | 2: Half Note Triplet | ||
- | 3: Dotted Quarter Note 48 | ||
- | 4: Quarter Note 30 | ||
- | 5: Quarter Note Triplet | ||
- | 6: Dotted Eighth Note 24 | ||
- | 7: Eighth Note 18 | ||
- | 8: Triplet | ||
- | 9: Sixteenth Note 0C | ||
- | A: Sixteenth Note Triplet | ||
- | B: Thirty-second Note 06 | ||
- | C: Thirty-second Note Tripet | ||
- | D: Sixty-fourth Note 03 | ||
- | | ||
- | ==== Note Names ==== | ||
- | |||
- | 0: C 00-0D | ||
- | 1: C#/Db 0E-1B | ||
- | 2: D 1C-29 | ||
- | 3: D#/Eb 2A-37 | ||
- | 4: E 38-45 | ||
- | 5: F 46-53 | ||
- | 6: F#/Gb 54-61 | ||
- | 7: G 62-6F | ||
- | 8: G#/Ab 70-7D | ||
- | 9: A 7E-8B | ||
- | A: A#/Bb 8C-99 | ||
- | B: B 9A-A7 | ||
- | C: Tie A8-B5 | ||
- | D: Rest B6-C3 | ||
- | | ||
- | ==== SPC Command Codes ==== | ||
- | |||
- | C4: xx $11D3 Set Voice Volume to xx (00-7F) | ||
- | C5: xx yy $11E4 Set Voice Volume w/ Envelope (yy: volume, xx: envelope duration) | ||
- | C6: xx $1236 Set Voice Pan to (xx: 01 = Left, 40 = Center, 7F = Right, top bit inactive) | ||
- | C7: xx yy $1246 Set Voice Pan w/ Envelope (yy: 01 = Left, 40 = Center, 7F = Right, top bit inactive, xx = envelope duration) | ||
- | C8: xx yy $1266 Change Pitch w/ Envelope (xx: envelope duration, yy: change in pitch, signed) | ||
- | C9: xx yy zz $12E3 Enable Vibrato (xx: delay in ticks, yy: cycle duration, ??zzzzzz: amplitude, max 1/4 step) | ||
- | CA: $138C Disable Vibrato | ||
- | CB: xx yy zz $1396 Enable Tremolo (xx: delay in ticks, yy: cycle duration, ??zzzzzz: amplitude, max 50%) | ||
- | CC: $13EA Disable Tremolo | ||
- | CD: xx yy $13F4 Enable Pansweep (xx: delay in ticks, yy: cycle duration) | ||
- | CE: $144A Disable Pansweep | ||
- | CF: xx $14CB Set Noise Clock (00-1F) | ||
- | D0: $148D Enable Noise | ||
- | D1: $14BB Disable Noise | ||
- | D2: $14D9 Enable Pitch Modulation | ||
- | D3: $14F2 Disable Pitch Modulation | ||
- | D4: $1464 Enable Echo | ||
- | D5: $147D Disable Echo | ||
- | D6: xx $1460 Set Octave to xx | ||
- | D7: $1456 Increment Octave | ||
- | D8: $145C Decrement Octave | ||
- | D9: xx $1275 Set Transpose | ||
- | DA: xx $1271 Add to Transpose | ||
- | DB: xx $174E Set Detune | ||
- | DC: xx $1502 Set Instrument | ||
- | DD: xx $1538 Set ADSR Attack Value (0-15) | ||
- | DE: xx $1568 Set ADSR Decay Value (0-7) | ||
- | DF: xx $157B Set ADSR Sustain Value (0-7) | ||
- | E0: xx $158D Set ADSR Release Value (0-31) | ||
- | E1: $159D Reset ADSR Default Values | ||
- | E2: xx $16C0 Loop Start (loop xx+1 times) | ||
- | E3: $16F0 Loop End | ||
- | E4: $15B4 Enable Slur (key on at beginning of first note only, no key off at end of note unless the next note is a rest) | ||
- | E5: $0FD3 Disable Slur | ||
- | E6: $15DE Enable Drum Roll (no key off at end of note unless the next note is a rest) | ||
- | E7: $0FD3 Disable Drum Roll | ||
- | E8: xx $174B Add to Note Duration (xx = duration in ticks) | ||
- | E9: xx $1602 Play Game Sound Effect (voice A) | ||
- | EA: xx $1606 Play Game Sound Effect (voice B) | ||
- | EB: $1770 End of Script | ||
- | EC: $1770 End of Script | ||
- | ED: $1770 End of Script | ||
- | EE: $1770 End of Script | ||
- | EF: $1770 End of Script | ||
- | F0: xx $11AF Set Tempo | ||
- | F1: xx yy $11B8 Set Tempo w/ Envelope | ||
- | F2: xx $1205 Set Song Echo Volume | ||
- | F3: xx yy $1212 Set Song Echo Volume w/ Envelope | ||
- | F4: xx $11D0 Set Song Volume | ||
- | F5: xx yyyy $1665 Jump to yyyy When Loop Count Reaches xx | ||
- | F6: xxxx $164A Jump to xxxx | ||
- | F7: xx yy $1279 Set Echo Feedback to yy over xx frames | ||
- | F8: xx yy $129B Set Filter ------yy | ||
- | F9: $1752 Increment Output Code | ||
- | FA: $1755 Clear Output Code | ||
- | FB: $15B0 Ignore Song Volume | ||
- | FC: xxxx $1759 Conditional Jump to xxxx | ||
- | FD: $1770 End of Script | ||
- | FE: $1770 End of Script | ||
- | FF: $1770 End of Script | ||
- | | ||
- | ==== SPC Interrupt Codes ==== | ||
- | |||
- | 00: No Interrupt | ||
- | 10: xx yy $0A1E Load New Song (x: song number, y: master volume) | ||
- | 11: xx yy $0A26 Load New Song (pause current song) | ||
- | 14: xx yy $0A1B Long New Song (alternate start position) | ||
- | 15: xx yy $0A23 Long New Song (alternate start position, pause current song) | ||
- | 18: xx yy $0B3D Game Sound Effect (x: sound effect number, y: pan value [$80 = center]) | ||
- | 20: Cursor (select) | ||
- | 21: Cursor (move/ | ||
- | 22: Error | ||
- | 23: Ring (Success) | ||
- | 24: Delete/ | ||
- | 28: Ba-ding high (character becomes active in battle) | ||
- | 29: Ba-ding low (character controlled by player 2 becomes active in battle) | ||
- | 2C: Ching | ||
- | 30-3F Quick Load Song $00-$0F at full volume (scpu commands, no effect in spc) | ||
- | 80: xx yy $0C6A Set master/ | ||
- | 81: xx yy $0C6A Set master volume to yy (w/ envelope xx) | ||
- | 82: xx yy $0C6A Set sound effect volume to yy (w/ envelope xx) | ||
- | 83: xx yy $0CE5 Set sound effect pan to yy (w/ envelope xx) | ||
- | 84: xx yy $0D09 Set Tempo Ratio (yy = envelope duration, xx = tempo ratio, signed fraction) | ||
- | 85: xx yy $0D35 Change Pitch | ||
- | 89: $0F9C Enable Conditional Jump (used by Phantom Train and Dancing Mad) | ||
- | F0: $0D6F Stop song & sound effect | ||
- | F1: $0D6F Stop song | ||
- | F2: $0D6F Stop sound effect | ||
- | F3: xx $0D61 Enable/ | ||
- | F4: xx $0DC3 Mute Voices (x: voices to mute, bitmask) | ||
- | F5: xx $0DCA Pause/ | ||
- | F6: xx $0F83 Enable/ | ||
- | FC: xx $1002 Set Echo Delay to xx | ||
- | FD: xx yy $0FE8 Set DSP Register xx with data yy | ||
- | FE: xx $0E38 Transfer Data from SCPU | ||
- | 00: no transfer | ||
- | 01: transfer one byte at a time | ||
- | 02: transfer two bytes at a time | ||
- | 03: transfer three bytes at a time | ||
- | 07: move chunk | ||
- | FF: xx yy $0FA3 Reset Codes | ||
- | 01: enable/ | ||
- | 02: enable/ | ||
- | F0: reset spc | ||
- | | ||
- | ==== Signed Fractions ==== | ||
- | |||
- | $80: 1/2x | ||
- | $A0: 5/8x | ||
- | $C0: 3/4x | ||
- | $E0: 7/8x | ||
- | $00: 1x | ||
- | $20: 5/4x | ||
- | $40: 3/2x | ||
- | $60: 7/4x | ||
- | $7F: 2x | ||
- | | ||
- | ==== Song Format ==== | ||
- | |||
- | 2 bytes preceding data in the ROM are the length of the song | ||
- | +$00 Song Start Address (HiROM) | ||
- | +$02 Song End Address (HiROM) | ||
- | $04-$13 Voice Start Addresses (HiROM) | ||
- | $14-$23 Voice Start Addresses (HiROM, alternate start position) | ||
- | $24-EOF Song Data | ||