Skip to content

Commit 333819c

Browse files
authored
Merge pull request #231 from Wuerfel21/master
Add OPN2cog and SNEcog objects
2 parents d75ee2f + fae6631 commit 333819c

26 files changed

+1951
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
CON
2+
3+
'' OPN2cog example/test that plays a note normally and then with all 8 SSG-EG modes.
4+
5+
_CLKFREQ = 250_000_000
6+
7+
leftPin = 48+7
8+
rightPin = 49+5
9+
10+
RATE = 4
11+
12+
OBJ
13+
OPN2 : "OPN2cog"
14+
15+
VAR
16+
long waitFor, tick
17+
18+
PUB Main() | continue, i, cmd, n
19+
20+
21+
OPN2.start(leftPin, rightPin, 3, true) ' Start OPN2cog
22+
23+
waitFor := getct() + 100_000_000
24+
25+
OPN2.setCHAlgo(OPN2.CH1,7,0)
26+
OPN2.setCHPanning(OPN2.CH1,1,1)
27+
OPN2.setOPRegister(OPN2.CH1, OPN2.OP4, OPN2.OP_MUL_DT ,$01)
28+
OPN2.setOPRegister(OPN2.CH1, OPN2.OP4, OPN2.OP_TL ,0)
29+
OPN2.setOPRegister(OPN2.CH1, OPN2.OP4, OPN2.OP_AR_RS ,31+0)
30+
OPN2.setOPRegister(OPN2.CH1, OPN2.OP4, OPN2.OP_DR_AM ,1+0)
31+
OPN2.setOPRegister(OPN2.CH1, OPN2.OP4, OPN2.OP_SR ,16)
32+
OPN2.setOPRegister(OPN2.CH1, OPN2.OP4, OPN2.OP_RR_SL ,$09)
33+
34+
OPN2.setCHFreq(OPN2.CH1,12000)
35+
36+
37+
pinl(56)
38+
39+
repeat
40+
waitct(waitFor)
41+
waitfor += clkfreq/RATE
42+
pint(56)
43+
44+
45+
case tick // 3
46+
0:
47+
OPN2.setOPRegister(OPN2.CH1, OPN2.OP4, OPN2.OP_SSGEG ,lookupz((tick/3)//9:0,8,9,10,11,12,13,14,15))
48+
OPN2.setKeyOn(OPN2.CH1,%1000)
49+
50+
2: OPN2.setKeyOn(OPN2.CH1,%0000)
51+
52+
53+
OPN2.flipRegisters()
54+
tick++
55+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
CON
2+
3+
'' OPN2cog example that plays a weird little tune using the Spin API and VGI patch files.
4+
5+
_CLKFREQ = 250_000_000
6+
7+
leftPin = 48
8+
rightPin = 49
9+
10+
RATE = 8
11+
12+
#0,DRONE_CH,OSTINATO_CH,MELODY_CH,CHORD_CH1,CHORD_CH2,CHORD_CH3
13+
14+
OBJ
15+
OPN2 : "OPN2cog"
16+
17+
VAR
18+
long waitFor, tick
19+
20+
PUB Main() | continue, i, cmd, n
21+
22+
23+
OPN2.start(leftPin, rightPin, 3, true) ' Start OPN2cog
24+
25+
waitFor := getct() + 1_000_000
26+
27+
OPN2.setLFO(2)
28+
29+
OPN2.loadVGI(DRONE_CH,@instr_drone)
30+
OPN2.setCHPanning(DRONE_CH,1,1)
31+
32+
OPN2.loadVGI(OSTINATO_CH,@instr_vibra)
33+
OPN2.setCHPanning(OSTINATO_CH,1,1)
34+
35+
OPN2.loadVGI(MELODY_CH,@instr_thingy)
36+
OPN2.setCHPanning(MELODY_CH,1,1)
37+
38+
repeat i from CHORD_CH1 to CHORD_CH3
39+
OPN2.loadVGI(i,@instr_chords)
40+
OPN2.setCHPanning(CHORD_CH1,1,1)
41+
OPN2.setCHPanning(CHORD_CH2,0,1)
42+
OPN2.setCHPanning(CHORD_CH3,1,0)
43+
44+
pinl(56)
45+
46+
repeat
47+
waitct(waitFor)
48+
waitfor += clkfreq/RATE
49+
pint(56)
50+
51+
' Handle ostinato
52+
ifnot tick&1
53+
OPN2.setCHFreq(OSTINATO_CH,note2freq(ostinato_notes[(tick>>1)//4]))
54+
OPN2.setKeyOn(OSTINATO_CH,%1111)
55+
else
56+
OPN2.setKeyOn(OSTINATO_CH,%0000)
57+
58+
' Handle chords
59+
i := (tick>>4)*3
60+
case tick&15
61+
0:
62+
OPN2.setKeyOn(CHORD_CH3,%0000)
63+
n := chord_notes[i+0]
64+
OPN2.setCHFreq(CHORD_CH1,note2freq(n))
65+
OPN2.setKeyOn(CHORD_CH1,%1111)
66+
2:
67+
n := chord_notes[i+1]
68+
OPN2.setCHFreq(CHORD_CH2,note2freq(n))
69+
OPN2.setKeyOn(CHORD_CH2,%1111)
70+
4:
71+
n := chord_notes[i+2]
72+
OPN2.setCHFreq(CHORD_CH3,note2freq(n))
73+
OPN2.setKeyOn(CHORD_CH3,%1111)
74+
14: OPN2.setKeyOn(CHORD_CH1,%0000)
75+
15: OPN2.setKeyOn(CHORD_CH2,%0000)
76+
77+
78+
79+
80+
' Handle drone
81+
if tick == 0
82+
OPN2.setCHFreq(DRONE_CH,note2freq(D+2*12))
83+
OPN2.setKeyOn(DRONE_CH,%1111)
84+
85+
' Handle melody
86+
ifnot tick&1
87+
case n := lead_notes[tick>>1]
88+
255: ' do nothing
89+
254: ' do nothing
90+
0: ' do nothing
91+
other:
92+
OPN2.setCHFreq(MELODY_CH,note2freq(n))
93+
OPN2.setKeyOn(MELODY_CH,%1111)
94+
else
95+
case n := lead_notes[tick>>1+1]
96+
255: OPN2.setKeyOn(MELODY_CH,%0000)
97+
254: tick := -1
98+
0: ' do nothing
99+
other: OPN2.setKeyOn(MELODY_CH,%0000)
100+
101+
102+
103+
OPN2.flipRegisters()
104+
tick++
105+
106+
107+
PUB note2freq(noten) : r
108+
109+
return ((noten/12)<<11)+freq_tbl[noten//12]
110+
111+
CON
112+
113+
#0,C,Cs,D,Ds,E,F,Fs,G,Gs,A,As,B
114+
115+
116+
DAT
117+
118+
freq_tbl word 664,681,722,765,810,858,910,964,1021,1081,1146,1214
119+
120+
ostinato_notes byte D+3*12,E+3*12,G+3*12,F+3*12
121+
122+
lead_notes byte
123+
' 0
124+
byte 255
125+
byte 0
126+
byte 0
127+
byte 0
128+
129+
byte A+12*3
130+
byte 0
131+
byte 0
132+
byte 0
133+
134+
' 1
135+
byte As+12*3
136+
byte 0
137+
byte 0
138+
byte 0
139+
140+
byte G+12*3
141+
byte 0
142+
byte 0
143+
byte 0
144+
145+
' 2
146+
byte F+12*3
147+
byte 0
148+
byte 0
149+
byte 0
150+
151+
byte A+12*3
152+
byte 0
153+
byte 0
154+
byte 0
155+
156+
' 3
157+
byte 0
158+
byte 0
159+
byte 0
160+
byte 0
161+
162+
byte As+12*3
163+
byte 0
164+
byte F+12*3
165+
byte 0
166+
167+
' 4
168+
byte D+12*3
169+
byte 0
170+
byte 0
171+
byte 0
172+
173+
byte 0
174+
byte 0
175+
byte 0
176+
byte 255
177+
178+
' 5
179+
byte D+12*4
180+
byte 0
181+
byte E+12*4
182+
byte 0
183+
184+
byte C+12*4
185+
byte 0
186+
byte 0
187+
byte 0
188+
189+
' 6
190+
byte A+12*4
191+
byte 0
192+
byte 0
193+
byte 0
194+
195+
byte As+12*4
196+
byte F+12*4
197+
byte D+12*4
198+
byte 0
199+
200+
' 7
201+
byte 0
202+
byte 0
203+
byte C+12*4
204+
byte 0
205+
206+
byte 0
207+
byte 0
208+
byte A+12*3
209+
byte 0
210+
211+
'8
212+
byte 0
213+
byte 0
214+
byte D+12*4
215+
byte 0
216+
217+
byte 0
218+
byte 0
219+
byte 0
220+
byte 0
221+
222+
byte 254
223+
224+
chord_notes byte
225+
226+
byte 0,0,0
227+
byte 0,0,0
228+
byte 0,0,0
229+
byte 0,0,0
230+
231+
byte D+4*12,F+4*12,A+4*12
232+
byte D+4*12,F+4*12,A+4*12
233+
byte C+4*12,E+4*12,A+4*12
234+
byte C+4*12,Ds+4*12,G+4*12
235+
byte C+4*12,Ds+4*12,G+4*12
236+
237+
instr_drone file "drone.vgi"
238+
instr_vibra file "vibra.vgi"
239+
instr_thingy file "thingy.vgi"
240+
instr_chords file "chords.vgi"
241+
242+

0 commit comments

Comments
 (0)