class AudioApp(App): def build(self): root = GridLayout(padding=20, spacing=10, cols=4) self.stream = AudioStream(channels=2, buffersize=1024) self.gens = {} for x in xrange(20): sample = AudioSample(partial(self.audio_callback, x)) self.stream.add_sample(sample) btn = Button(text='Sample %d' % x) btn.bind(state=partial(self.update_state, x)) slider = Slider(min=110, max=880, value=440) slider.bind(value=partial(self.update_freq, x)) root.add_widget(btn) root.add_widget(slider) # generators gen_left = sine_wave() gen_right = sine_wave(frequency=220.0) self.gens[x] = [sample, gen_left, gen_right, None, None] return root def update_freq(self, x, slider, value): self.gens[x][3] = value self.gens[x][4] = value / 2 def update_state(self, x, instance, value): if value == 'down': self.gens[x][0].play() elif value == 'normal': self.gens[x][0].stop() def audio_callback(self, x, sample, index, bufsize): buf = [] f = (2 ** 16) / pi lvl = lvr = None g = self.gens[x] gen_left, gen_right, next_freq_left, next_freq_right = g[1:] while len(buf) < bufsize / 2: vl = int(gen_left.next() * f) vr = int(gen_right.next() * f) if next_freq_left and lvl == 0 and vl > 0: g[1] = gen_left = sine_wave(frequency=next_freq_left) g[3] = next_freq_left = None vl = int(gen_left.next() * f) if next_freq_right and lvr == 0 and vr > 0: g[2] = gen_right = sine_wave(frequency=next_freq_right) g[4] = next_freq_right = None vr = int(gen_right.next() * f) lvl = vl lvr = vr buf.append(vl) buf.append(vr) return pack('h' * len(buf), *buf)
class AudioApp(App): def build(self): root = GridLayout(padding=20, spacing=10, cols=4) self.stream = AudioStream(channels=2, buffersize=1024) self.gens = {} for x in xrange(20): sample = AudioSample(partial(self.audio_callback, x)) self.stream.add_sample(sample) btn = Button(text='Sample %d' % x) btn.bind(state=partial(self.update_state, x)) slider = Slider(min=110, max=880, value=440) slider.bind(value=partial(self.update_freq, x)) root.add_widget(btn) root.add_widget(slider) # generators gen_left = sine_wave() gen_right = sine_wave(frequency=220.0) self.gens[x] = [sample, gen_left, gen_right, None, None] return root def update_freq(self, x, slider, value): self.gens[x][3] = value self.gens[x][4] = value / 2 def update_state(self, x, instance, value): if value == 'down': self.gens[x][0].play() elif value == 'normal': self.gens[x][0].stop() def audio_callback(self, x, sample, index, bufsize): buf = [] f = (2**16) / pi lvl = lvr = None g = self.gens[x] gen_left, gen_right, next_freq_left, next_freq_right = g[1:] while len(buf) < bufsize / 2: vl = int(gen_left.next() * f) vr = int(gen_right.next() * f) if next_freq_left and lvl == 0 and vl > 0: g[1] = gen_left = sine_wave(frequency=next_freq_left) g[3] = next_freq_left = None vl = int(gen_left.next() * f) if next_freq_right and lvr == 0 and vr > 0: g[2] = gen_right = sine_wave(frequency=next_freq_right) g[4] = next_freq_right = None vr = int(gen_right.next() * f) lvl = vl lvr = vr buf.append(vl) buf.append(vr) return pack('h' * len(buf), *buf)
def build(self): root = GridLayout(padding=20, spacing=10, cols=4) self.stream = AudioStream(channels=2, buffersize=1024) self.gens = {} for x in xrange(20): sample = AudioSample(partial(self.audio_callback, x)) self.stream.add_sample(sample) btn = Button(text='Sample %d' % x) btn.bind(state=partial(self.update_state, x)) slider = Slider(min=110, max=880, value=440) slider.bind(value=partial(self.update_freq, x)) root.add_widget(btn) root.add_widget(slider) # generators gen_left = sine_wave() gen_right = sine_wave(frequency=220.0) self.gens[x] = [sample, gen_left, gen_right, None, None] return root