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 for1
through5
.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
to7F
if direct,00
to1F
otherwise.18xx
: enable echo buffer.19xx
: set echo delay. range is0
toF
.1Axx
: set left echo channel volume.
1Bxx
: set right echo channel volume.
1Cxx
: set echo feedback.- all of these are signed numbers.
00
to7F
for 0 to 127.80
toFF
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 is00
to1F
. 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 is0
toF
.
21xx
: set decay. range is0
to7
.
22xx
: set sustain. range is0
to7
.
23xx
: set release. range is00
to1F
.- 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
to7F
for 0 to 127.80
toFF
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.
tables
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
- SNES-format BRR samples at SMW Central