예제 #1
0
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
예제 #2
0
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)