Samuel Sloniker
1 year ago
2 changed files with 51 additions and 0 deletions
@ -0,0 +1,50 @@
|
||||
import math |
||||
|
||||
|
||||
class SignalGenerator: |
||||
def __init__( |
||||
self, |
||||
frequency, |
||||
amplitude, |
||||
sample_rate, |
||||
output_range=(-1, 1), |
||||
convert_to_int=False, |
||||
): |
||||
self.phase = 0 |
||||
self.frequency = frequency |
||||
self.amplitude = amplitude |
||||
self.sample_rate = sample_rate |
||||
self.output_range = output_range |
||||
self.convert_to_int = convert_to_int |
||||
|
||||
def sample(self): |
||||
sample = math.sin(self.phase * math.tau) * self.amplitude |
||||
self.phase += self.frequency / self.sample_rate |
||||
self.phase %= 1 |
||||
return (int if self.convert_to_int else float)( |
||||
remap(sample, -1, 1, self.output_range[0], self.output_range[1]) |
||||
) |
||||
|
||||
def generate_samples(self, samples): |
||||
return [self.sample() for _ in range(samples)] |
||||
|
||||
def generate_time(self, time): |
||||
return self.generate_samples(round(time * self.sample_rate)) |
||||
|
||||
|
||||
def remap(number, from_min, from_max, to_min, to_max): |
||||
number_s = number - from_min |
||||
from_max_s = from_max - from_min |
||||
to_max_s = to_max - to_min |
||||
return ((number_s / from_max_s) * to_max_s) + to_min |
||||
|
||||
|
||||
g = SignalGenerator(0, 1, 48000, (0, 255), True) |
||||
|
||||
with open("input.raw", "rb") as f: |
||||
data = list(f.read()) |
||||
|
||||
with open("output.raw", "wb+") as f: |
||||
for d in data: |
||||
g.frequency = ((d / 255) * 12500) + 4000 |
||||
f.write(bytes(g.generate_samples(6))) |
Loading…
Reference in new issue