EECS151 / riscv-cpu / scripts / piano_scale_generator.py
piano_scale_generator.py
Raw
import wave
import random
import struct
import sys
import math

"""
    This script will generate a text file to be fed into the rom_generator.py script.
    It will print out the keyboard letter mappings in ASCII to piano notes. The piano notes
    are stored in terms of tone_switch_periods for a given clock frequency.
"""
output_file = sys.argv[1]
# Can supply custom clock frequency, otherwise defaults to 125 Mhz
if len(sys.argv) > 2:
    clock_freq = float(sys.argv[2])
else:
    clock_freq = 125.0e6

note_map = {
    'Z': 65.4064,
    'S': 69.2957,
    'X': 73.4162,
    'D': 77.7817,
    'C': 82.4069,
    'V': 87.3071,
    'G': 92.4986,
    'B': 97.9989,
    'H': 103.826,
    'N': 110.000,
    'J': 116.541,
    'M': 123.471,
    '<': 130.813,

    'z': 130.813,
    's': 138.591,
    'x': 146.832,
    'd': 155.563,
    'c': 164.814,
    'v': 174.614,
    'g': 184.997,
    'b': 195.998,
    'h': 207.652,
    'n': 220.000,
    'j': 233.082,
    'm': 246.942,
    ',': 261.626,

    'q': 261.626,
    '2': 277.183,
    'w': 293.665,
    '3': 311.127,
    'e': 329.628,
    'r': 349.228,
    '5': 369.994,
    't': 391.127,
    '6': 415.305,
    'y': 440.000,
    '7': 466.164,
    'u': 493.883,
    'i': 523.251,

    'Q': 523.251,
    '@': 554.365,
    'W': 587.330,
    '#': 622.254,
    'E': 659.255,
    'R': 698.456,
    '%': 739.989,
    'T': 783.991,
    '^': 830.609,
    'Y': 880.000,
    '&': 932.328,
    'U': 987.767,
    'I': 1046.50
}

piano_output_file = open(output_file, 'w')
for ascii_index in range(256):
    if chr(ascii_index) in note_map:
        note_freq = note_map[chr(ascii_index)]
        note_tone_switch_period = round(float(clock_freq) / float(note_freq) / 2.0)
        piano_output_file.write(str(int(note_tone_switch_period)) + "\n")
    else:
        piano_output_file.write("0\n")

piano_output_file.close()