85 lines
1.7 KiB
Python
85 lines
1.7 KiB
Python
import random
|
|
|
|
class PianoString:
|
|
|
|
def __init__(self, s, note, i):
|
|
|
|
self.s = s
|
|
|
|
self.basefreq = self.s.note(note)
|
|
self.primary_gain = 0.4
|
|
|
|
self.mod = self.s.node()
|
|
self.node = self.s.node()
|
|
|
|
self.node.setpos(0, -10.0+i, 0, 0)
|
|
|
|
self.node.setbasefreq(0, self.basefreq)
|
|
self.node.setgain(0, self.primary_gain)
|
|
|
|
self.mod.setbasefreq(0, 10)
|
|
self.mod.setgain(0, 0.8)
|
|
self.node.fmsetup(0, self.basefreq, 0.009)
|
|
self.node.setskew(0, 0.3)
|
|
|
|
self.node.setadsrgain(0, 1)
|
|
self.node.setadsrsustain(0, 0.2)
|
|
|
|
self.s.wire(self.mod, self.node)
|
|
self.s.air(self.node, [self.s.left, self.s.right])
|
|
|
|
def gain(self, starttick, gain):
|
|
|
|
self.node.setgain(starttick, gain)
|
|
|
|
def play(self, starttick, endtick):
|
|
|
|
keyhold_endtick = endtick
|
|
endtick += self.s.sec(0.3)
|
|
|
|
self.node.adsr(starttick, endtick,
|
|
self.s.sec(0.03),
|
|
self.s.sec(0.03),
|
|
self.s.sec(0.36),
|
|
keyhold_endtick - starttick,
|
|
keyhold_endtick - starttick + self.s.sec(0.3))
|
|
|
|
#self.mod.sine(starttick, endtick)
|
|
#self.node.fm(starttick, endtick)
|
|
self.node.sine(starttick, endtick, 0.2)
|
|
self.node.skewsine(starttick, endtick, 0.3)
|
|
self.node.square(starttick, endtick, 0.04)
|
|
|
|
self.node.adsr(starttick, endtick,
|
|
self.s.sec(0.067),
|
|
self.s.sec(0.07),
|
|
self.s.sec(0.09),
|
|
self.s.sec(0.1),
|
|
self.s.sec(0.2))
|
|
|
|
self.node.whitenoise(starttick, endtick, 0.01)
|
|
self.node.triangle(starttick, endtick, 0.2)
|
|
|
|
|
|
def playsec(self, start, end):
|
|
|
|
self.play(self.s.sec(start), self.s.sec(end))
|
|
|
|
|
|
notes = 'CDEFGAB'
|
|
octaves = '345'
|
|
|
|
gamma = []
|
|
|
|
for o in octaves:
|
|
for n in notes:
|
|
gamma.append(n+o)
|
|
s.setup(s.sec(60))
|
|
|
|
for i in range(0, len(gamma)):
|
|
note = gamma[i]
|
|
|
|
S = PianoString(s, note, i)
|
|
|
|
S.playsec(i, i+1.4)
|
|
|