def _testAdd(do_plot=False, plot_input=False): plot_output = not plot_input # Use additive synthesis to create a pseudo-square wave using sine waves. hz = 20 oscil.set_chunk_size(5000) overtone_count = range(1, 4) fundamental = oscil.Sine(hz=hz) overtones = (oscil.Sine(hz=(hz * ((2 * n) + 1)), vol=(1 / ((2 * n) + 1))) for n in overtone_count) harmonics = itertools.chain((fundamental,), overtones) square_tone = add(harmonics, plot_input) for num_iters, samples in enumerate(square_tone): if do_plot: if plot_output: msg = 'Testing mixer.add() (n_harmonics={}, fundamental_hz={})' msg = msg.format(overtone_count, hz) plot_samples(samples, len(samples), msg=msg) else: # show output print(samples) if num_iters >= 2: break
def test_get_wave(sample_rate, instrument='square'): import functools import mixer # create and set wave generator oscil.set_chunk_size(1024) # setup note frequencies octave = 4 root = notes.Note(notes.C, octave) C, Cs, D, Ds, E, F, Fs, G, Gs, A, As, B = [ root.transpose(semitone).freq for semitone in range(notes.HALF_STEPS) ] Db, Eb, Gb, Bb = Cs, Ds, Fs, As def imperial_march(bar=-1, instrument='square'): dur = 28 # set "instrument" (in this case, just an oscillator) o_args = {'sample_rate': sample_rate} if instrument is None or instrument == 'square': o = oscil.Square o_args['duty'] = 0.5 elif instrument == 'sawtooth': o = oscil.Sawtooth o_args['width'] = 1.0 else: o = oscil.Sine wf = bwf = functools.partial(o, **o_args) # set up chords silence = oscil.Flat(sample_rate) Gm = mixer.add((wf(hz=D, vol=1/4), wf(hz=Bb, vol=1/4), wf(hz=G, vol=1/4), bwf(hz=G/2, vol=1/4))) Gm_low = mixer.add((wf(hz=D, vol=1/4), wf(hz=Bb, vol=1/4), wf(hz=G, vol=1/4), bwf(hz=Eb/2, vol=1/4))) Eb_m = mixer.add((wf(hz=Eb, vol=1/4), wf(hz=Gb, vol=1/4), wf(hz=Bb, vol=1/4), bwf(hz=Eb/2, vol=1/4))) Eb_m2 = mixer.add((wf(hz=Eb, vol=1/3), wf(hz=Gb, vol=1/3), wf(hz=Bb, vol=1/3))) Gm2 = mixer.add((wf(hz=D*2, vol=1/3), wf(hz=Bb*2, vol=1/3), wf(hz=G*2, vol=1/3))) # first two bars if bar == -1 or bar == 1 or bar == 2: for _ in range(3): for _, a in zip(range(dur), Gm): yield a for _, a in zip(range(int(dur/3)), silence): yield a for _ in range(2): for _, a in zip(range(dur), Eb_m): yield a for _, a in zip(range(int(dur/2)), wf(hz=D*2, vol=1/3)): yield a for _, a in zip(range(dur), Gm): yield a for _, a in zip(range(int(dur/3)), silence): yield a for _, a in zip(range(int(dur/3)), silence): yield a for _, a in zip(range(int(dur/2)), wf(hz=G/2, vol=1/3)): yield a if bar == -1 or bar == 3 or bar == 4: # 3rd bar for _ in range(3): for _, a in zip(range(dur), Gm2): yield a for _, a in zip(range(int(dur/3)), silence): yield a for _, a in zip(range(dur), Eb_m2): yield a #for _, a in zip(range(dur), Gm): yield a for _, a in zip(range(int(dur/2)), wf(hz=D*2, vol=1/3)): yield a # 4th bar for _, a in zip(range(dur), Gm_low): yield a for _, a in zip(range(int(dur/3)), silence): yield a for _, a in zip(range(dur), Eb_m): yield a for _, a in zip(range(int(dur/2)), wf(hz=D*2, vol=1/3)): yield a for _, a in zip(range(dur), Gm): yield a yield from imperial_march(-1, instrument)