spc700 music playing code

Discussion of hardware and software development for Super NES and Super Famicom. See the SNESdev wiki for more information.

Moderator: Moderators

Forum rules
  • For making cartridges of your Super NES games, see Reproduction.
Post Reply
psycopathicteen
Posts: 3140
Joined: Wed May 19, 2010 6:12 pm

spc700 music playing code

Post by psycopathicteen »

I'm trying to come up with a code to play music, and here's what I came up with so far. Any suggestions?

Code: Select all

define sfx_timer($00)
define pitch_slide($01)
define sfx_number($03)
define frame_number($04)
define tempo_delay($05)

str $fa=#$80
str $f1=#$11

str $f2=#$0f
str $f3=#$7f	//FIR filter is all pass
str $f2=#$0c
str $f3=#$7f	//left volume 100%
str $f2=#$1c
str $f3=#$7f	//right volume 100%
str $f2=#$2c
str $f3=#$00	//echo volume 0%
str $f2=#$3c
str $f3=#$00	//echo volume 0%
str $f2=#$6c
str $f3=#$00
str $f2=#$0d
str $f3=#$00	//feedback 0%
str $f2=#$4d
str $f3=#$00	//no channel with echo
str $f2=#$5d
str $f3=#$80	//directory
str $f2=#$6d
str $f3=#$ff	//echo buffer
str $f2=#$7d
str $f3=#$00	//shortest delay possible

str $f2=#$00
str $f3=#$7f	//channel 0 left volume
str $f2=#$01
str $f3=#$7f	//channel 0 right volume
str $f2=#$02
str $f3=#$00
str $f2=#$03
str $f3=#$10	//original pitch
str $f2=#$04
str $f3=#$00	//square
str $f2=#$07
str $f3=#$7f	//gain up



str {tempo_delay}=#$08


spc_loop:
lda $fd
beq spc_loop

dec {tempo_delay}
bne spc_loop




ldx {frame_number}
txa
clc
adc #$04
sta {frame_number}
lda track,x
beq +
lda track+1,x
tay
lda note_scale,y
pha
lda track+2,x
tay
lda octave_scale,y
ply
mul
str $f2=#$02
sta $f3
str $f2=#$03
sty $f3
str $f2=#$4c
str $f3=#$01	//key on
+;

ldx {frame_number}
txa
clc
adc #$04
sta {frame_number}
lda track,x
beq +
lda track+1,x
tay
lda note_scale,y
pha
lda track+2,x
tay
lda octave_scale,y
ply
mul
str $f2=#$12
sta $f3
str $f2=#$13
sty $f3
str $f2=#$4c
str $f3=#$02	//key on
+;

ldx {frame_number}
txa
clc
adc #$04
sta {frame_number}
lda track,x
beq +
lda track+1,x
tay
lda note_scale,y
pha
lda track+2,x
tay
lda octave_scale,y
ply
mul
str $f2=#$22
sta $f3
str $f2=#$23
sty $f3
str $f2=#$4c
str $f3=#$04	//key on
+;

ldx {frame_number}
txa
clc
adc #$04
sta {frame_number}
lda track,x
beq +
lda track+1,x
tay
lda note_scale,y
pha
lda track+2,x
tay
lda octave_scale,y
ply
mul
str $f2=#$32
sta $f3
str $f2=#$33
sty $f3
str $f2=#$4c
str $f3=#$08	//key on
+;



ldx {frame_number}
txa
clc
adc #$04
sta {frame_number}
lda track,x
beq +
lda track+1,x
tay
lda note_scale,y
pha
lda track+2,x
tay
lda octave_scale,y
ply
mul
str $f2=#$42
sta $f3
str $f2=#$43
sty $f3
str $f2=#$4c
str $f3=#$10	//key on
+;

ldx {frame_number}
txa
clc
adc #$04
sta {frame_number}
lda track,x
beq +
lda track+1,x
tay
lda note_scale,y
pha
lda track+2,x
tay
lda octave_scale,y
ply
mul
str $f2=#$52
sta $f3
str $f2=#$53
sty $f3
str $f2=#$4c
str $f3=#$20	//key on
+;

ldx {frame_number}
txa
clc
adc #$04
sta {frame_number}
lda track,x
beq +
lda track+1,x
tay
lda note_scale,y
pha
lda track+2,x
tay
lda octave_scale,y
ply
mul
str $f2=#$62
sta $f3
str $f2=#$63
sty $f3
str $f2=#$4c
str $f3=#$40	//key on
+;

ldx {frame_number}
txa
clc
adc #$04
sta {frame_number}
lda track,x
beq +
lda track+1,x
tay
lda note_scale,y
pha
lda track+2,x
tay
lda octave_scale,y
ply
mul
str $f2=#$72
sta $f3
str $f2=#$73
sty $f3
str $f2=#$4c
str $f3=#$80	//key on
+;


str {tempo_delay}=#$08




jmp spc_loop


//track format: key on, pitch, octave, sample


track:
db $01,$00,$04,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $01,$02,$04,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $01,$04,$04,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $01,$05,$04,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $01,$07,$04,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $01,$09,$04,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $01,$0b,$04,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
db $01,$00,$05,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00






note_scale:
db 64,68,72,76,81,85,91,96,102,108,114,121


octave_scale:
db 1,2,4,8,16,32,64,128



seek($838000)
directory:
dw square
dw square


square:
db $83,$77,$77,$77,$77,$88,$88,$88,$88
psycopathicteen
Posts: 3140
Joined: Wed May 19, 2010 6:12 pm

Re: spc700 music playing code

Post by psycopathicteen »

I'm surprised nobody responded yet. When I get done with this does anybody want to compose music for my game?
User avatar
Drew Sebastino
Formerly Espozo
Posts: 3496
Joined: Mon Sep 15, 2014 4:35 pm
Location: Richmond, Virginia

Re: spc700 music playing code

Post by Drew Sebastino »

psycopathicteen wrote:I'm surprised nobody responded yet. When I get done with this does anybody want to compose music for my game?
Not many people have worked, or have even really tried, if at all, to work with the SPC 700. That's literally my last concern. Abount composing music, What kind of music are you even looking for? I probably won't really be able to help. I'm a sucker for crappy sounding guitar music like this: https://www.youtube.com/watch?v=S_6ChXTP9TA, so that's probably what you'll end up with if you ask me. I'm going to start making music whenever the thing bazz is making is done.
User avatar
TmEE
Posts: 960
Joined: Wed Feb 13, 2008 9:10 am
Location: Norway (50 and 60Hz compatible :P)
Contact:

Re: spc700 music playing code

Post by TmEE »

The very least you want to make a program that converts music from some exiting format to what your driver uses. Making music "blindly" by entering numbers isn't gonna attract a whole lot of people.
psycopathicteen
Posts: 3140
Joined: Wed May 19, 2010 6:12 pm

Re: spc700 music playing code

Post by psycopathicteen »

Is the ADSR supposed to stay at the sustain level until the note is keyed off?, because it's not doing it.
User avatar
Bregalad
Posts: 8056
Joined: Fri Nov 12, 2004 2:49 pm
Location: Divonne-les-bains, France

Re: spc700 music playing code

Post by Bregalad »

Is the ADSR supposed to stay at the sustain level until the note is keyed off?, because it's not doing it.
Nope, sustain on the SPC700 is actually what would be called decay2 on other synths. The envelope continues to decay exponentially at sustain rate, except in the particular case where sustain rate is #0, then it actually sustains.
User avatar
TmEE
Posts: 960
Joined: Wed Feb 13, 2008 9:10 am
Location: Norway (50 and 60Hz compatible :P)
Contact:

Re: spc700 music playing code

Post by TmEE »

Very few instruments sustain at "0" though, organ is probably the biggest example.
How many db is one ADSR step ?
User avatar
Bregalad
Posts: 8056
Joined: Fri Nov 12, 2004 2:49 pm
Location: Divonne-les-bains, France

Re: spc700 music playing code

Post by Bregalad »

What are you refering to by "ADSR step" ?

According to Anomie's doc, Internally the ADSR uses 11-bit values internally, but the register for sustain level is only 3-bit, and manipulation via the GAIN modes is 7-bit. In all cases, the volume correction is linear internally so there's no such thing as an "ADSR step dB", so your question can't be answered.
User avatar
TmEE
Posts: 960
Joined: Wed Feb 13, 2008 9:10 am
Location: Norway (50 and 60Hz compatible :P)
Contact:

Re: spc700 music playing code

Post by TmEE »

I figured the ADSR envelope uses logarithmic attenuation scale, but if it is linear all the way then yes, there's no answer. That is so odd, linear scale and envelopes don't mix so well from my experience but now looking at the design of the device it makes sense, anything else would be fair bit extra complexity.
User avatar
Bregalad
Posts: 8056
Joined: Fri Nov 12, 2004 2:49 pm
Location: Divonne-les-bains, France

Re: spc700 music playing code

Post by Bregalad »

No, you didn't understand and/or I worded this badly.

The decrease of volume enveloppe is indeed exponential (although the attack is linear but that's another story). But there is not such a thing as a "step" as you seem to be describing in your question, making your question unanswerable.
User avatar
TmEE
Posts: 960
Joined: Wed Feb 13, 2008 9:10 am
Location: Norway (50 and 60Hz compatible :P)
Contact:

Re: spc700 music playing code

Post by TmEE »

There is a counter or such for the envelope generator, and each count is a "step" (and the steps aren't in log scale as I thought).
I got my answers when I looked through the SPC section in nocash's docs.
psycopathicteen
Posts: 3140
Joined: Wed May 19, 2010 6:12 pm

Re: spc700 music playing code

Post by psycopathicteen »

Does this sound like a good idea of organizing parameters?

Instrument parameters:
-sample number
-stereo panning
-pitch modulation enable
-noise enable
-echo enable
-ADSR and GAIN envelopes
-vibrato
-detuning amount
-channel joining

Track parameters:
-note
-instrument
-duration
-volume
-sweep
-key offs

I want to keep the less frequently changed parameters as "instrument parameters," and the more frequently changed parameters as "track parameters," to keep things neat and organized.
KungFuFurby
Posts: 275
Joined: Wed Jul 09, 2008 8:46 pm

Re: spc700 music playing code

Post by KungFuFurby »

That seems like a good way to organize the parameters.

If it weren't for the fact that I have college work to attend to (which can seriously hamper my musical production at times), I would jump right in on the condition that the converter accepts IT files. That, and perhaps a nice quick way for me to test the music so I can do proper prototyping (whether it be by making a SNES ROM or a SPC file).
Post Reply