sonnum/mysynths/epiano.py

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)