README.md
Rendering markdown...
#!/usr/bin/python3
import argparse
SONGS = {
'mario':
['G3', '-', 'G3', '---', 'G3', '---', 'D#3', '-', 'G3', '---', 'A#3', '-------', 'A#3',
'-------', 'D#3', '-------', 'A#2', '---', 'G2', '-----', 'C3',
'---', 'D3', '---', 'C#3', '-', 'C3', '---', 'A#2', '--', 'G3', '-', 'A#3', '--', 'C4', '---', 'G#3',
'-', 'A#3', '---', 'G3', '---', 'D#3', '-', 'F3', '-', 'D3', '-----', 'D#3', '-----', 'A#2'
'-----', 'G2', '-----', 'C3', '---', 'D3', '---', 'C#3', '-', 'C3', '---', 'A#2',
'--', 'G3', '-', 'A#3', '--', 'C4', '---', 'G#3', '-', 'A#3', '---', 'G3', '---', 'D#3', '-', 'F3', '-', 'D3'],
'taylor_swift':
['F#4', '-', 'A4', '-', 'E5', '-', 'D5', '-', 'E5', '-', 'D5', '-', 'A4', '-', 'D5', '-',
'F#4', '-', 'A4', '-', 'E5', '-', 'D5', '-', 'E5', '-', 'D5', '-', 'A4', '-', 'D5', '-',
'E4', '-', 'A4', '-', 'E5', '-', 'D5', '-', 'E5', '-', 'D5', '-', 'A4', '-', 'D5', '-']
}
def getFrequency(note):
A4 = 440
notes = ['A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#']
octave = int(note[2]) if len(note) == 3 else int(note[1])
keyNumber = notes.index(note[0:-1]);
if (keyNumber < 3) :
keyNumber = keyNumber + 12 + ((octave - 1) * 12) + 1;
else:
keyNumber = keyNumber + ((octave - 1) * 12) + 1;
return int(A4 * 2** ((keyNumber- 49) / 12))
def convert(song):
rob_triplets = []
for idx,i in enumerate(song):
last_note = idx == len(song) - 1
if last_note:
delay = 0
else:
if '-' in song[idx + 1]:
delay = len(song[idx + 1]) * 70
elif '-' in i:
continue
if '-' not in i:
freq = getFrequency(i)
rob_triplets.append((freq, 180, delay))
return rob_triplets
def formatRob(triplets):
cmd = ''
base_cmd = 'rob call applications.beeper customBeep "{('
chunks = [triplets[i:i + 15] for i in range(0, len(triplets), 15)]
for chunk in chunks:
tmp_base_cmd = ''
num_notes = len(chunk)
i_str = '{iii}' * num_notes
tmp_base_cmd += base_cmd + i_str + ')}" song'
for note in chunk:
f, d, o = note
rob_note = f' frequency {f} duration {d} offDuration {o}'
tmp_base_cmd += rob_note
print('----------')
print(tmp_base_cmd)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('-s', '--song', choices=['mario', 'taylor_swift'], help='Display the ROB command to play the chosen song', required=True)
args = parser.parse_args()
print(f'Converting: {args.song}')
triplets = convert(SONGS.get(args.song))
formatRob(triplets)