def test_square_gen(self): """gen.SquareGenerator""" gen = splat.gen.SquareGenerator() f = 1000.0 gen.run(0.0, 1.0, f) nf = gen.frag.rate / f samples = {int(nf * 0.1): (1.0, 1.0), int(nf * 0.9): (-1.0, -1.0)} self.assert_samples(gen.frag, samples) self.assert_md5(gen.frag, '0ca047e998f512280800012b05107c63')
def test_gen_levels(self): """Generator and source levels""" freq = 123.45 duration = 1.0 for levels in [-3.0, -3, int(-3), long(-3), (-3.0, -3.0), (int(-3), int(-3)), (long(-3), long(-3))]: frag = splat.data.Fragment(duration=duration) splat.sources.sine(frag, levels, freq) gen = splat.gen.SineGenerator() gen.run(0.0, duration, freq, levels=levels) self.assert_md5([frag, gen.frag], "1d6c38f467b1bdb5a9c3e8d573e815f4")
def test_sine_gen(self): """gen.SineGenerator""" gen = splat.gen.SineGenerator() freq = 1000.0 ph = 6.789 gen.run(0.0, 1.0, freq, ph) n = int(0.1234 * gen.frag.duration * gen.frag.rate) s = math.sin(2 * math.pi * freq * (ph + float(n) / gen.frag.rate)) self.assert_samples(gen.frag, {n: (s, s)}) self.assert_md5(gen.frag, 'ec18389e198ee868d61c9439343a3337')
def test_gen_levels(self): """Generator and source levels""" freq = 123.45 duration = 1.0 for levels in [-3.0, -3, int(-3), long(-3), (-3.0, -3.0), (int(-3), int(-3)), (long(-3), long(-3))]: frag = splat.data.Fragment(duration=duration) splat.sources.sine(frag, levels, freq) gen = splat.gen.SineGenerator() gen.run(0.0, duration, freq, levels=levels) self.assert_md5([frag, gen.frag], '1d6c38f467b1bdb5a9c3e8d573e815f4')
def test_triangle_gen(self): """gen.TriangleGenerator""" gen = splat.gen.TriangleGenerator() f = 1000.0 ratio = 0.567 gen.run(0.0, 1.0, f, 0.0, ratio) nf = gen.frag.rate / f x1 = 0.25 t1 = int(nf * ratio * x1) s1 = (t1 * 2.0 / (ratio * nf)) - 1.0 x2 = 0.75 ratio2 = 1 - ratio t2 = int(nf * (ratio + (ratio2 * x2))) a2 = -2.0 / (ratio2 * nf) b2 = 1.0 - (a2 * ratio * nf) s2 = (t2 * a2) + b2 samples = {t1: (s1, s1), t2: (s2, s2)} self.assert_samples(gen.frag, samples) self.assert_md5(gen.frag, 'b6d9eb000b328134cd500173b24f1c88')
def test_frag_offset(self): """Fragment.offset""" offset = 1234.5 frag = splat.data.Fragment(duration=1.0) n = int(0.5678 * frag.duration * frag.rate) frag.offset(offset) frag_twice = splat.data.Fragment(duration=1.0) gen = splat.gen.SineGenerator(frag=frag_twice) gen.run(0.0, 1.0, 1000.0) frag_twice.offset(offset) frag_twice_ref = frag_twice[n][0] offset2 = -57.25 offset_check = frag_twice_ref + offset2 frag_twice.offset(offset2) frag_sig = splat.data.Fragment(duration=1.0) frag_sig.offset(lambda x: offset) self.assert_samples(frag, {n: (offset, offset)}) self.assert_samples(frag_sig, {n: (offset, offset)}) self.assert_samples(frag_twice, {n: (offset_check, offset_check)}) self.assert_md5([frag, frag_sig], '248070c79f99014cf800d05ea81e0679')
def test_gen(self): gen = self.gen_cls(frag=self.frag) gen.overtones = self.ot gen.run(0.0, self.frag.duration, self.freq)
def test_gen_mixed(self): gen = self.gen_cls(frag=self.frag) gen.overtones = self.ot gen.run(0.0, self.frag.duration, self.freq, levels=self.mod)
def test_gen_signal(self): gen = self.gen_cls(frag=self.frag) gen.overtones = self.sig_ot gen.run(0.0, self.frag.duration, self.freq, levels=self.mod)
def run_tests(freq=123.45, duration=30.0, phase=23.456, pts=None, overtones=None, verbose=False): if pts is None: pts = [0.0, 0.2, 0.234, 0.456, 0.45602, 0.7124, 0.89, 0.90001] if overtones is None: overtones = [(1.0, 0.0, 0.45), (2.58, 12.345, 0.45), (200.0, 0.0, 1.0)] cases = [] # ------------------------------------------------------------------------- frag = splat.data.Fragment(channels=1) gen = splat.gen.SineGenerator(frag=frag) gen.run(0.0, duration, freq, phase) frag.save('sine-{}.wav'.format(splat.SAMPLE_WIDTH), normalize=False) cases.append('sine') if verbose: print('sine') for t in pts: t = duration * t n = frag.s2n(t) t = float(n) / frag.rate st = 2 * cmath.pi * freq * (t + phase) y1 = frag[n][0] y2 = math.sin(st) delta = abs(y2 - y1) if delta != 0.0: delta_dB = "{:.3f}".format(splat.lin2dB(delta)) else: delta_dB = 'infinity' if verbose: print(t, y1, y2, delta_dB) # ------------------------------------------------------------------------- frag = splat.data.Fragment(channels=1) gen = splat.gen.OvertonesGenerator(frag=frag) gen.overtones = overtones gen.run(0.0, duration, freq) frag.save('overtones-{}.wav'.format(splat.SAMPLE_WIDTH), normalize=False) cases.append('overtones') max_ratio = frag.rate / 2.0 / freq ot_clipped = [] for ot in gen.overtones: if ot[0] < max_ratio: ot_clipped.append(ot) if verbose: print('overtones') for t in pts: t = duration * t n = frag.s2n(t) y1 = frag[n][0] y2 = sum(a * math.sin(2 * cmath.pi * freq * r * (t + ph)) for r, ph, a in ot_clipped) delta = abs(y2 - y1) if delta != 0.0: delta_dB = "{:.3f}".format(splat.lin2dB(delta)) else: delta_dB = 'infinity' if verbose: print(t, y1, y2, delta_dB) # ------------------------------------------------------------------------- duration = 1.0 sig = splat.data.Fragment(channels=1) splat.gen.TriangleGenerator(frag=sig).run(0.0, duration, 12.0, levels=0.5) sig.offset(0.5) mod = splat.data.Fragment(channels=1) splat.gen.TriangleGenerator(frag=mod).run(0.0, duration, 4.0, levels=0.002) mod.offset(0.5) frag = splat.data.Fragment() splat.gen.SineGenerator(frag=frag).run(0.0, duration, 456.0, levels=sig, phase=lambda x: math.sin(x)) frag.save('sine-signal-{}.wav'.format(splat.SAMPLE_WIDTH), normalize=False) cases.append('sine-signal') frag = splat.data.Fragment() gen = splat.gen.OvertonesGenerator(frag=frag) gen.overtones = overtones gen.run(0.0, duration, 456.0, levels=sig) frag.save('overtones-mixed1-{}.wav'.format(splat.SAMPLE_WIDTH), normalize=False) cases.append('overtones-mixed1') frag = splat.data.Fragment() gen = splat.gen.OvertonesGenerator(frag=frag) gen.overtones = overtones gen.run(0.0, duration, 456.0, levels=sig, phase=mod) frag.save('overtones-mixed2-{}.wav'.format(splat.SAMPLE_WIDTH), normalize=False) cases.append('overtones-mixed2') sig2 = splat.data.Fragment(channels=1) splat.gen.TriangleGenerator(frag=sig2).run(0.0, duration, 1.8, levels=0.1) sig2.offset(-sig2.get_peak()[0]['min']) overtones.append((0.54, 0.0, sig2)) frag = splat.data.Fragment() gen = splat.gen.OvertonesGenerator(frag=frag) gen.overtones = overtones gen.run(0.0, duration, 456.0, levels=sig, phase=mod) frag.save('overtones-signal-{}.wav'.format(splat.SAMPLE_WIDTH), normalize=False) cases.append('overtones-signal') frag = splat.data.Fragment() gen = splat.gen.SineGenerator(frag=frag) gen.run(0.0, 5.678, 1234.56, levels=dB(-3)) ratio = 1.987 new_len = int(len(frag) * ratio) rem = new_len % 4 if rem: new_len -= rem else: new_len -= 4 frag.resample(ratio=ratio) frag.resize(length=new_len) frag.save('resample-float-{}.wav'.format(splat.SAMPLE_WIDTH)) cases.append('resample-float') frag = splat.data.Fragment() gen = splat.gen.SineGenerator(frag=frag) gen.run(0.0, 5.678, 1234.56, levels=dB(-3)) ratio = 1.987 frag.resample(ratio=lambda x: ratio) frag.save('resample-signal-{}.wav'.format(splat.SAMPLE_WIDTH)) cases.append('resample-signal') return cases
def test_overtones_gen(self): """gen.OvertonesGenerator""" gen = splat.gen.OvertonesGenerator() gen.ot_decexp(1.0) gen.run(0.0, 1.0, 1000.0, 0.1) self.assert_md5(gen.frag, 'ee045e012673ff7ed4ab9bd590b57368')
def main(argv): parser = argparse.ArgumentParser("Dew Drop tune using irrational rythm.") parser.add_argument('--save-as', default='dew_drop.wav', help="output file name, leave blank to not save") parser.add_argument('--no-reverb', action='store_true', help="do not generate the reverb effect") parser.add_argument('--dump-scale', action='store_true', help="dump the frequency of the notes in the scale") parser.add_argument('--rate', type=int, default=48000, help="sample rate") parser.add_argument('--voices', default='123', help="voices to run (string with 1, 2 and 3)") args = parser.parse_args(argv[1:]) gen = splat.gen.OvertonesGenerator(splat.data.Fragment(2, args.rate, 18.0)) s = splat.scales.LogScale(fund=440.0) if args.dump_scale is True: # print frequencies of all the notes of the scale over 3 octaves for octave in range(-2, 1): for note in ['A', 'B', 'C#', 'D', 'E', 'F#', 'G#']: note_name = "{0}{1}".format(note, octave) print('{0:4s}: {1:.3f}'.format(note_name, s[note_name])) print("-------------") if '1' in args.voices: print("Voice 1") gen.levels = (dB(-2.5), dB(-2.5)) gen.ot_decexp(2.0) set_fade(gen, 0.04) gen.run(0.0, 1.62, s['A-2']) gen.run(1.62, 3.24, s['D-2']) gen.run(3.24, 4.248, s['F#-2']) gen.run(4.248, 5.868, s['E-2']) gen.run(5.868, 6.858, s['D-2']) gen.run(6.858, 8.496, s['F#-2']) gen.run(8.496, 9.504, s['E-2']) gen.run(9.504, 11.124, s['B-2']) gen.run(11.124, 12.744, s['E-2']) gen.run(12.744, 13.752, s['A-2']) gen.run(13.752, 14.742, s['D-2']) gen.run(14.742, 16.38, s['E-2']) gen.run(16.38, 18.0, s['A-2']) if '2' in args.voices: print("Voice 2") gen.levels = (dB(0.0), dB(-2.5)) gen.ot_decexp(1.6) set_fade(gen, 0.02) gen.run(0.0, 1.008, s['C#-1']) gen.run(1.008, 1.62, s['E-1']) gen.run(1.62, 2.628, s['A-1']) gen.run(2.628, 3.24, s['F#-2']) gen.run(3.24, 3.852, s['A-1']) gen.run(3.852, 4.248, s['C#-1']) gen.run(4.248, 4.86, s['B-1']) gen.run(4.86, 5.868, s['D-1']) gen.run(5.868, 6.858, s['B-1']) gen.run(6.858, 7.848, s['C#-1']) gen.run(7.848, 8.496, s['A-1']) gen.run(8.496, 9.504, s['G#-2']) gen.run(9.504, 10.494, s['D-1']) gen.run(10.494, 11.124, s['F#-1']) gen.run(11.124, 11.754, s['B-1']) gen.run(11.754, 12.744, s['D-1']) gen.run(12.744, 13.752, s['E-1']) gen.run(13.752, 14.364, s['F#-1']) gen.run(14.364, 15.372, s['A-1']) gen.run(15.372, 16.38, s['D-1']) gen.run(16.38, 18.0, s['C#-1']) if '3' in args.voices: print("Voice 3") gen.levels = (dB(-2.5), dB(0.0)) gen.ot_decexp(1.2) set_fade(gen, 0.015) gen.run(0.0, 0.612, s['E']) gen.run(0.612, 1.008, s['D']) gen.run(1.008, 1.62, s['E']) gen.run(1.62, 2.232, s['D']) gen.run(3.24, 3.852, s['C#']) gen.run(3.852, 4.248, s['A']) gen.run(4.248, 4.86, s['B']) gen.run(4.86, 5.256, s['D']) gen.run(5.256, 5.868, s['E']) gen.run(5.868, 6.858, s['F#']) gen.run(8.496, 8.874, s['D']) gen.run(8.874, 9.504, s['E']) gen.run(9.504, 10.494, s['F#']) gen.run(10.494, 11.124, s['A']) gen.run(11.124, 11.754, s['B']) gen.run(11.754, 12.132, s['C#']) gen.run(12.132, 12.744, s['D']) gen.run(12.744, 13.752, s['C#']) gen.run(14.364, 15.372, s['B']) gen.run(15.372, 16.38, s['G#-1']) gen.run(16.38, 18.0, s['A']) if args.no_reverb is False: print("Reverb") d = splat.filters.reverb_delays() splat.filters.reverb(gen.frag, d) if args.save_as: print("Saving as {}".format(args.save_as)) padded = splat.data.Fragment(2, args.rate, (gen.frag.duration + 1.0)) padded.mix(gen.frag, 0.5) padded.save(args.save_as)