#picaxe 14m2
setfreq m4
'#terminal 4800
#terminal off
'#no_data
'#no_table
' Major W W H W W W H
' Minor W H W W H W W
data (0,252,238,212,189,178,158,141)
' B C D E F G A
data (126,118,105,94,88,79,70)
' B C D E F G A
data (62,59,52,46,44,39)
' B C D E F G
symbol piezo1 = c.2
symbol piezo2 = b.4
symbol piezo3 = b.2
symbol LED = c.1
symbol adc_prb = b.1
symbol adc_oct = c.0
symbol adc_dky = b.3
symbol adc_eff = b.5
symbol sw1 = pinc.3
symbol sw2 = pinc.4
symbol WVal1 = w13
symbol WVal2 = w12
symbol WVal3 = w11
symbol AVal = b1
symbol AvalX = b2
symbol dky = b3
symbol Note1 = b4
symbol Note2 = b5
symbol Note3 = b6
symbol Efct = b7
symbol Oct = b8
symbol ArpCnt = b9
symbol ArpNote = b10
symbol Mult = b11
symbol tmp1 = b12
symbol dkyx = b13
'symbol dkyx = b6
'symbol TDir = b7
'symbol Tmp2 = b10
'symbol Cnt = b13
'symbol note3x = b14
'symbol octx = b15
'symbol efctx = b16
symbol sp = 32
symbol hi = 1
symbol lo = 0
symbol true = 255
symbol false = 0
'tdir = true
'dkyx = 20
do
readadc adc_dky,dky ' Read decay pot - Min is no decay mode
dky = dky / 16
'if dky <> dkyx then ' Lookup for decay values
'lookup dky,(128,47,59,70,80,89,97,104,110,115,119,122,124,125,126,127),dky
lookup dky,(128,17,27,37,47,59,70,80,89,97,104,110,115,119,122,124),dky
' dkyx = dky
'end if
readadc adc_oct,oct ' Read octave pot
oct = oct / 51
'if oct<>octx then
select oct
case=0
setfreq m1
mult = 1
case=1
setfreq m2
mult = 2
case=2
setfreq m4
mult = 4
case=3
setfreq m8
mult = 8
case=4
setfreq m16
mult = 16
end select
'octx = oct
'end if
readadc adc_prb,aval ' Get position of probe
aval = 255 - aval + 10 / 22
'aval = 255 - aval + 16 / 18
if aval <> avalx and aval <=16 then
avalx = aval
gosub newnote
end if
if aval = 0 and dky = 128 then
wval1 = 0
wval2 = 0
wval3 = 0
end if
tmp1 = tmp1 + 1 // mult
if tmp1 = 0 then
wval1 = wval1 * dky/128
wval2 = wval2 * dky/128
wval3 = wval3 * dky/128
pwmduty piezo1,wval1
pwmduty piezo2,wval2
pwmduty piezo3,wval3
toggle led
end if
loop
NewNote:
read AVal,Note1
if note1 <> 0 then
readadc adc_eff,efct ' Note sound - 0 to 7
efct = efct / 32
select efct
case 0 ' Unison
note2 = note1
note3 = note1
wval1 = note1 * 2
wval2 = note1 * 2
wval3 = note1 * 2
pwmout pwmdiv16, piezo1,note1,wval1
pwmout pwmdiv16, piezo2,note2,wval2
pwmout pwmdiv16, piezo3,note3,wval3
case 1 ' Octave up & down
note2 = note1 / 2
note3 = note1 / 2
wval1 = note1 * 2
wval2 = note2 * 2
wval3 = note3 * 2
pwmout pwmdiv16, piezo1,note1,wval1
pwmout pwmdiv16, piezo2,note2,wval2
pwmout pwmdiv64, piezo3,note3,wval3
case 2 ' 2 octavesup & down
note2 = note1
note3 = note1
wval1 = note1 * 2
wval2 = note2 * 2
wval3 = note3 * 2
pwmout pwmdiv4, piezo1,note1,wval1
pwmout pwmdiv16, piezo2,note2,wval2
pwmout pwmdiv64, piezo3,note3,wval3
case 3 ' Minor 5th chord
note2 = note1 * 5 / 6 ' Min 3rd
note3 = note1 * 2 / 3 ' Perf 5th
wval1 = note1 * 2
wval2 = note2 * 2
wval3 = note3 * 2
pwmout pwmdiv16, piezo1,note1,wval1
pwmout pwmdiv16, piezo2,note2,wval2
pwmout pwmdiv16, piezo3,note3,wval3
case 4 ' Major 5th chord
note2 = note1 * 4 / 5 ' Maj 3rd
note3 = note1 * 2 / 3 ' Perf 5th
wval1 = note1 * 2
wval2 = note2 * 2
wval3 = note3 * 2
pwmout pwmdiv16, piezo1,note1,wval1
pwmout pwmdiv16, piezo2,note2,wval2
pwmout pwmdiv16, piezo3,note3,wval3
case 5 ' Power chord - Root and 5th
note2 = note1 / 3
note3 = note1 * 2 / 5
wval1 = note1 * 2
wval2 = note2 * 2
wval3 = note3 * 2
pwmout pwmdiv16, piezo1,note1,wval1
pwmout pwmdiv16, piezo2,note2,wval2
pwmout pwmdiv64, piezo3,note3,wval3
case 6 ' 3 channels offset
note2 = note1 * 238 / 240
note3 = note1 * 244 / 240
wval1 = note1 * 2
wval2 = note2 * 2
wval3 = note3 * 2
pwmout pwmdiv16, piezo1,note1,wval1
pwmout pwmdiv16, piezo2,note2,wval2
pwmout pwmdiv16, piezo3,note3,wval3
case 7 ' Major 5th chord arpeggiated
note2 = note1 * 4 / 5 ' Maj 3rd
note3 = note1 * 2 / 3 ' Perf 5th
wval1 = note1 * 2
wval2 = note2 * 2
wval3 = note3 * 2
pwmout pwmdiv16, piezo1,note1,wval1
pwmout pwmdiv16, piezo2,note2,wval2
pwmout pwmdiv16, piezo3,note3,wval3
end select
end if
return
LedFlash:
high led
pause 50
low led
return