95 lines
2.0 KiB
Python
95 lines
2.0 KiB
Python
import subprocess
|
|
|
|
import numpy as np
|
|
from pojagi_dsp.channel.generator.sine import SineWave
|
|
import sys
|
|
import datetime
|
|
from itertools import islice
|
|
|
|
from matplotlib import pyplot as plt
|
|
from scipy.io import wavfile
|
|
|
|
from pojagi_dsp.channel import Constantly
|
|
from pojagi_dsp.channel.filter.envelope import Envelope
|
|
|
|
|
|
SRATE = 44100
|
|
|
|
|
|
def test_sawtooth(
|
|
fundamental: float,
|
|
npartials: int = 10,
|
|
seconds: float = 1.0,
|
|
):
|
|
sine = Constantly(0, srate=SRATE)
|
|
|
|
for idx in range(1, npartials):
|
|
freq = fundamental * idx
|
|
amp = 1 / idx
|
|
|
|
partial = SineWave(freq, synchronize=True)
|
|
partial *= amp
|
|
sine += partial
|
|
|
|
sine |= lambda g: (x / 3 for x in g)
|
|
sine |= Envelope(
|
|
[
|
|
(0, 0.0),
|
|
(int(SRATE * seconds / 2), 1.0),
|
|
(SRATE * seconds, 0.0),
|
|
]
|
|
)
|
|
|
|
values = []
|
|
for y in sine.of_duration(datetime.timedelta(seconds=seconds)):
|
|
values.append(y)
|
|
|
|
return values
|
|
|
|
|
|
def test_pitchbend(
|
|
from_pitch: float,
|
|
to_pitch: float,
|
|
seconds: float = 1.0,
|
|
):
|
|
sine = SineWave(hz=from_pitch, srate=SRATE)
|
|
|
|
sig = sine | Envelope(
|
|
[
|
|
(0, 0.0),
|
|
(int(SRATE * seconds / 2), 1.0),
|
|
(SRATE * seconds, 0.0),
|
|
]
|
|
)
|
|
|
|
lfo = (SineWave(1/seconds, srate=SRATE) * 30)
|
|
lfo += (SineWave(seconds) * 20)
|
|
lfo = lfo.stream()
|
|
|
|
values = []
|
|
for idx in range(int(seconds * SRATE)):
|
|
values.append(next(sig))
|
|
# if idx % 5000 == 0:
|
|
sine.hz = from_pitch + next(lfo)
|
|
# print(from_pitch + next(lfo))
|
|
# import time
|
|
# time.sleep(0.001)
|
|
|
|
return values
|
|
|
|
|
|
def do_test(values: list[float]):
|
|
plt.plot(range(len(values)), values)
|
|
plt.show()
|
|
|
|
audio = np.array(values, dtype=np.float32)
|
|
wavfile.write("/tmp/output.wav", SRATE, audio)
|
|
|
|
with subprocess.Popen(["mplayer", "/tmp/output.wav"]) as p:
|
|
p.wait()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# do_test(test_sawtooth(55.0))
|
|
do_test(test_pitchbend(110.0, 110.0, seconds=10))
|