furnace/doc/7-systems/snes.md

10 KiB

Super Nintendo Entertainment System (SNES) / Super Famicom

the successor to NES to compete with Genesis, packing superior graphics and sample-based audio.

its Sony-developed audio system features a DSP chip, SPC700 CPU, and 64KB of dedicated SRAM used by both. this whole system itself is pretty much a separate computer that the main CPU needs to upload its program and samples to.

Furnace communicates with the DSP directly and provides a full 64KB of memory. this memory might be reduced excessively on ROM export to make up for playback engine and pattern data. you can go to window > statistics to see how much memory your samples are using.

some notable features of the DSP are:

  • pitch modulation, meaning that you can use 2 channels to make a basic FM synth without eating up too much memory.
  • a built in noise generator, useful for hi-hats, cymbals, rides, effects, among other things.
  • per-channel echo, which unfortunately eats up a lot of memory but can be used to save channels in songs.
  • an 8-tap FIR filter for the echo, which is basically a procedural low-pass filter that you can edit however you want.
  • sample loop, but the loop points have to be multiples of 16.
  • left/right channel invert for surround sound.
  • ADSR and gain envelope modes.
  • 7-bit volume per channel.
  • sample interpolation, which is basically a low-pass filter that gets affected by the pitch of the channel.

Furnace also allows the SNES to use wavetables (and the wavetable synthesizer) in order to create more 'animated' sounds, using less memory than regular samples. this however is not a hardware feature, and might be difficult to implement on real hardware.

effects

  • 10xx: set waveform.
  • 11xx: toggle noise mode.
  • 12xx: toggle echo on this channel.
  • 13xx: toggle pitch modulation. frequency modulation by the previous channel's output. no effect on channel 1.
  • 14xy: toggle inverting the left or right channels. x is left, y is right.
  • 15xx: set envelope mode. see gain chart below for 1 through 5.
    • 0: ADSR mode.
    • 1: gain (direct). volume holds at one level.
    • 2: linear decrement. volume lowers by subtractions of 1/64.
    • 3: exponential decrement. volume lowers by multiplications of 255/256.
    • 4: linear increment. volume rises by additions of 1/64.
    • 5: bent line (inverse log) increment. volume rises by additions of 1/64 until 3/4, then additions of 1/256.
  • 16xx: set gain. 00 to 7F if direct, 00 to 1F otherwise.
  • 18xx: enable echo buffer.
  • 19xx: set echo delay. range is 0 to F.
  • 1Axx: set left echo channel volume.
    1Bxx: set right echo channel volume.
    1Cxx: set echo feedback.
    • all of these are signed numbers.
    • 00 to 7F for 0 to 127.
    • 80 to FF for -128 to -1.
      • setting these to -128 is not recommended as it may cause echo output to overflow and therefore click.
  • 1Dxx: set noise generator frequency. range is 00 to 1F. see noise frequencies chart below.
  • 1Exx: set left dry / global volume.
    1Fxx: set right dry / global volume.
    • these do not affect echo.
  • 20xx: set attack. range is 0 to F.
    21xx: set decay. range is 0 to 7.
    22xx: set sustain. range is 0 to 7.
    23xx: set release. range is 00 to 1F.
    • these four are only used in ADSR envelope mode. see ADSR chart below.
  • 30xx: set echo filter coefficient 0.
    31xx: set echo filter coefficient 1.
    32xx: set echo filter coefficient 2.
    33xx: set echo filter coefficient 3.
    34xx: set echo filter coefficient 4.
    35xx: set echo filter coefficient 5.
    36xx: set echo filter coefficient 6.
    37xx: set echo filter coefficient 7.
    • all of these are signed numbers.
    • 00 to 7F for 0 to 127.
    • 80 to FF for -128 to -1.
    • Note: Be sure the sum of all coefficients is between -128 and 127. sums outside that may result in overflow and therefore clicking.
    • see SnesLab for a full explanation and examples.

info

this chip uses the SNES instrument editor.

ADSR

attack 0→1 time decay 1→S time sustain ratio release S→0 time
00 4.1s 00 1.2s 00 1/8 00
01 2.5s 01 740ms 01 2/8 01 38s
02 1.5s 02 440ms 02 3/8 02 28s
03 1.0s 03 290ms 03 4/8 03 24s
04 640ms 04 180ms 04 5/8 04 19s
05 380ms 05 110ms 05 6/8 05 14s
06 260ms 06 74ms 06 7/8 06 12s
07 160ms 07 37ms 07 1 07 9.4s
08 96ms 08 7.1s
09 64ms 09 5.9s
0A 40ms 0A 4.7s
0B 24ms 0B 3.5s
0C 16ms 0C 2.9s
0D 10ms 0D 2.4s
0E 6ms 0E 1.8s
0F 0ms 0F 1.5s
10 1.2s
11 880ms
12 740ms
13 590ms
14 440ms
15 370ms
16 290ms
17 220ms
18 180ms
19 150ms
1A 110ms
1B 92ms
1C 74ms
1D 55ms
1E 37ms
1F 18ms

reference: Super Famicom Development Wiki

gain

value linear inc. bent line inc. linear dec. exponent dec.
00
01 4.1s 7.2s 4.1s 38s
02 3.1s 5.4s 3.1s 28s
03 2.6s 4.6s 2.6s 24s
04 2.0s 3.5s 2.0s 19s
05 1.5s 2.6s 1.5s 14s
06 1.3s 2.3s 1.3s 12s
07 1.0s 1.8s 1.0s 9.4s
08 770ms 1.3s 770ms 7.1s
09 640ms 1.1s 640ms 5.9s
0A 510ms 900ms 510ms 4.7s
0B 380ms 670ms 380ms 3.5s
0C 320ms 560ms 320ms 2.9s
0D 260ms 450ms 260ms 2.4s
0E 190ms 340ms 190ms 1.8s
0F 160ms 280ms 160ms 1.5s
10 130ms 220ms 130ms 1.2s
11 96ms 170ms 96ms 880ms
12 80ms 140ms 80ms 740ms
13 64ms 110ms 64ms 590ms
14 48ms 84ms 48ms 440ms
15 40ms 70ms 40ms 370ms
16 32ms 56ms 32ms 290ms
17 24ms 42ms 24ms 220ms
18 20ms 35ms 20ms 180ms
19 16ms 28ms 16ms 150ms
1A 12ms 21ms 12ms 110ms
1B 10ms 18ms 10ms 92ms
1C 8ms 14ms 8ms 74ms
1D 6ms 11ms 6ms 55ms
1E 4ms 7ms 4ms 37ms
1F 2ms 3.5ms 2ms 18ms

reference: Super Famicom Development Wiki

noise frequencies

value freq. value freq.
00 0 Hz 10 500 Hz
01 16 Hz 11 667 Hz
02 21 Hz 12 800 Hz
03 25 Hz 13 1.0 KHz
04 31 Hz 14 1.3 KHz
05 42 Hz 15 1.6 KHz
06 50 Hz 16 2.0 KHz
07 63 Hz 17 2.7 KHz
08 83 Hz 18 3.2 KHz
09 100 Hz 19 4.0 KHz
0A 125 Hz 1A 5.3 KHz
0B 167 Hz 1B 6.4 KHz
0C 200 Hz 1C 8.0 KHz
0D 250 Hz 1D 10.7 KHz
0E 333 Hz 1E 16 KHz
0F 400 Hz 1F 32 KHz

reference: Super Famicom Development Wiki

resources