31 lines
856 B
Python
Executable File
31 lines
856 B
Python
Executable File
#! /usr/bin/env python3
|
|
|
|
from tones import SQUARE_WAVE
|
|
from tones.mixer import Mixer
|
|
import csv
|
|
import math
|
|
|
|
def frequency_to_midi(frequency):
|
|
'''
|
|
There are only 128 midi notes. The don't map nicely
|
|
to the SELCAL frequencies :'(
|
|
|
|
MIDI note #69 is A4 @ 440 Hz. The other notes are given by:
|
|
f = 440 * 2 ^ (n - 69)/12
|
|
'''
|
|
note = 12 * (math.log(frequency/220)/math.log(2)) + 57
|
|
return round(note)
|
|
|
|
tones = {}
|
|
with open('tones.csv', newline='') as csvfile:
|
|
reader = csv.DictReader(csvfile)
|
|
for row in reader:
|
|
tones[row['designator']] = float(row['frequency'])
|
|
|
|
for tone in tones:
|
|
print(f"{tone} is MIDI #{frequency_to_midi(tones[tone])}")
|
|
|
|
mixer = Mixer(44100, 1)
|
|
mixer.create_track(0, SQUARE_WAVE)
|
|
mixer.add_tone(0, frequency=tones[tone], duration=1.0)
|
|
mixer.write_wav(f'samples/{tone}.wav') |