import os, sys, time
from IPython.display import display, Javascript, HTML
import phm
p = phm.phm()
import pandas
notes_csv = pandas.read_csv('notes.csv', sep='\t')
notes = {}
for note, freq in zip(notes_csv.name, notes_csv.frequency):
notes[note] = freq
notes_csv[:4]
tempo = 160
shutup = lambda : p.set_frequency(0)
def play_note(name, beats=1):
display(Javascript("$('div#%s').addClass('playing');" % name))
play_frequency(notes[name], beats)
display(Javascript("$('div#%s').removeClass('playing');" % name))
def play_frequency(freq, beats=1):
mask = int(freq) % 15
p.write_outputs(mask)
p.set_frequency(freq)
time.sleep(beats * 60./tempo)
p.set_frequency(0)
p.write_outputs(0b0000)
def rest(beats=1):
time.sleep(beats * 60. / tempo)
def shutup_handler(self, etype, value, tb, tb_offset=None):
shutup()
print 'KeyboardInterrupt'
get_ipython().set_custom_exc((KeyboardInterrupt,), shutup_handler)
play_note('C4')
play_frequency(400)
class Note(object):
name = None
frequency = 0
def __init__(self, name, freq):
self.name = name
self.frequency = freq
def __hash__(self):
return self.freq
def __call__(self, beats=1):
play_frequency(self.frequency, beats)
g = globals()
for name, freq in notes.items():
g[name] = Note(name, freq)
C4()
C4()
D4()
E4()
E4()
def play_tune(tune_s, octave=4):
notelist = tune_s.split()
for note in notelist:
if ':' in note:
note, beats = note.split(':')
beats = float(beats)
else:
beats = 1
if note == 'r':
rest(beats)
continue
if note[-1] == '-':
note = note[:-1] + str(octave-1)
elif note[-1] == '+':
note = note[:-1] + str(octave+1)
elif not note[-1].isdigit():
note = note + str(octave)
play_note(note, beats)
tempo = 160
bar1 = 'E E F G G F E D C C D E E:1.5 D:.5 D:2'
bar2 = 'E E F G G F E D C C D E D:1.5 C:.5 C:2'
bar3 = 'D D E C D E:.5 F:.5 E C D E:.5 F:.5 E D C D G-:2'
play_tune(bar1)
play_tune(bar2)
play_tune(bar3)
key_t = "
{0}
"
black_key_t = ""
names = []
for o in range(8):
names.extend([ '%s%i' % (k,o) for k in 'CDEFGAB'])
keys = []
for name in names:
keys.append(key_t.format(name))
if name.startswith(tuple('ACDFG')):
sharpname = name[0] + 's' + name[1:]
keys.append(black_key_t.format(sharpname, sharpname[:2]))
print '\n'.join(keys[:10])
display(HTML("""""" % '\n'.join(keys)))
%%javascript
var myState = {};
myState.mousedown = false;
$(document).on("mousedown", function () { myState.mousedown = true; }
).on("mouseup", function () { myState.mousedown = false; });
var mousedown = function(e) {
$(this).addClass("playing");
IPython.notebook.kernel.execute("p.set_frequency(notes['" + $(this)[0].id + "'])");
}
var mouseenter = function(e) {
if ( !myState.mousedown ) return;
$(this).addClass("playing");
IPython.notebook.kernel.execute("p.set_frequency(notes['" + $(this)[0].id + "'])");
}
var shutup = function(e) {
if ( ! $(this).hasClass("playing") ) return ;
$(this).removeClass("playing");
IPython.notebook.kernel.execute("p.set_frequency(0)");
}
$("div.key").on("mousedown", mousedown
).on("mouseenter", mouseenter
).on("selectstart", false
).on("mouseup", shutup
).on("mouseout", shutup);
import numpy as np
tempo = 680
play_tune('E E r E r C E r G r:4 G- r:4', octave=4)
for i in range(2):
for i in range(2):
play_tune('C r:2 G- r:2 E- r:3 A- r B- r As- A- r')
play_tune('C E r G A r F G r E r C D B- r:4')
for i in range(2):
play_tune('G Fs F Ds r E r Gs- A- C r A- C D r:2')
play_tune('G Fs F Ds r E r C+ r C+ C+ r:4')
play_tune('G Fs F Ds r E r Gs- A- C r A- C D r:2 Eb r:2 D r:2 C r:4')
play_tune('C C r C r C D r E C r A- G- r:4')
play_tune('C C r C r C D r E r:8')
play_tune('C C r C r C D r E C r A- G- r:4')
play_tune('E E r E r C E r G r:4 G-:1.5 r:4')
play_tune('C r:2 G- r:2 E- r:3 A- r B- r As- A- r')
play_tune('C E r G A r F G r E r C D B- r:4')
for i in range(2):
play_tune('E C r G- r:2 Gs- r A- F r F A- r:4')
play_tune('D A:1.5 A A G F r:0.5 E C r:.5 A- G- r:4')
play_tune('E C r G- r:2 Gs- r A- F r F A- r:4')
play_tune('B- F F F E D C C- r C- D2 r:4')