1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
# GNU Solfege - free ear training software
# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Tom Cato Amundsen
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import random
import gtk
import gu, soundcard, mpd, mpd.musicdisplayer
import abstract, utils
import lessonfile
class Teacher(abstract.Teacher):
def __init__(self, exname, app):
abstract.Teacher.__init__(self, exname, app)
self.lessonfileclass = lessonfile.HeaderLessonfile
self.m_question = None
def new_question(self):
self.q_status = self.QSTATUS_NEW
self.m_question = ["c'", "cis'", "d'", "dis'", "e'", "f'", "fis'", "g'", "gis'", "a'", "ais'", "b'"]
for x in range(100):
a = random.randint(0, 11)
b = random.randint(0, 11)
self.m_question[a], self.m_question[b] = self.m_question[b], self.m_question[a]
def play_question(self):
if self.q_status == self.QSTATUS_NO:
return
soundcard.play_note(self.get_int('config/preferred_instrument'),
4, mpd.notename_to_int(self.m_question[0]),
self.get_int('config/preferred_instrument_velocity'))
def play_last_note(self):
if self.q_status == self.QSTATUS_NO:
return
soundcard.play_note(self.get_int('config/preferred_instrument'),
4, mpd.notename_to_int(self.m_question[-1]),
self.get_int('config/preferred_instrument_velocity'))
def play_all_notes(self):
if self.q_status == self.QSTATUS_NO:
return
s = r"\staff{"
for n in self.m_question:
s = s + " " + n
s = s + "}"
mpd.play_music(s, 60,
self.get_int('config/preferred_instrument'),
self.get_int('config/preferred_instrument_velocity'))
class Gui(abstract.Gui):
def __init__(self, teacher, window):
abstract.Gui.__init__(self, teacher, window, no_notebook=1)
self.g_music_displayer = mpd.musicdisplayer.MusicDisplayer(utils.play_tone)
self.g_music_displayer.clear()
self.g_music_displayer.set_policy(gtk.POLICY_NEVER, gtk.POLICY_NEVER)
self.practise_box.pack_start(self.g_music_displayer)
self.g_new = gu.bButton(self.action_area, _("_New"), self.new_question)
self.g_play_first_note = gu.bButton(self.action_area, _("_Play first note"), lambda f, s=self: s.m_t.play_question())
self.g_play_first_note.set_sensitive(False)
self.g_play_last_note = gu.bButton(self.action_area, _("Play _last note"), lambda f, s=self: s.m_t.play_last_note())
self.g_play_last_note.set_sensitive(False)
self.g_play_all = gu.bButton(self.action_area, _("Play _all"), lambda f, s=self: s.m_t.play_all_notes())
self.g_play_all.set_sensitive(False)
self.practise_box.show_all()
def new_question(self, widget=None):
self.m_t.new_question()
self.g_play_first_note.set_sensitive(True)
self.g_play_last_note.set_sensitive(True)
self.g_play_all.set_sensitive(True)
try:
self.m_t.play_question()
except Exception,e:
def cleanup():
self.g_play_first_note.set_sensitive(False)
self.g_play_last_note.set_sensitive(False)
self.g_play_all.set_sensitive(False)
if not self.standard_exception_handler(e, cleanup):
raise
s = r"\staff{"
for n in self.m_t.m_question:
s = s + " " + n
s = s + "}"
self.g_music_displayer.display(s,
self.get_int('config/feta_font_size=20'))
def on_start_practise(self):
self.g_new.grab_focus()
self.g_music_displayer.clear()
self.handle_config_box_visibility()
def on_end_practise(self):
self.m_t.end_practise()
self.g_play_first_note.set_sensitive(False)
self.g_play_last_note.set_sensitive(False)
self.g_play_all.set_sensitive(False)
|