File: twelvetone.py

package info (click to toggle)
solfege 2.0.4-4
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 3,200 kB
  • ctags: 1,844
  • sloc: python: 12,160; xml: 5,458; ansic: 1,486; makefile: 562; sh: 233
file content (95 lines) | stat: -rw-r--r-- 4,403 bytes parent folder | download
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
# GNU Solfege - eartraining for GNOME
# Copyright (C) 2000, 2001, 2002, 2003  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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

import random
import gtk

import gu, const, soundcard, mpd, mpd.musicdisplayer
import abstract, utils

class Teacher(abstract.Teacher):
    def __init__(self, exname, app):
        abstract.Teacher.__init__(self, exname, app)
        self.m_question = None
    def new_question(self):
        self.q_status = const.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 == const.QSTATUS_NO:
            return
        soundcard.play_note(self.get_int('config/preferred_instrument'),
                        4, 0, mpd.notename_to_int(self.m_question[0]),
                        self.get_int('config/preferred_instrument_velocity'))
    def play_last_note(self):
        if self.q_status == const.QSTATUS_NO:
            return
        soundcard.play_note(self.get_int('config/preferred_instrument'),
                        4, 0, mpd.notename_to_int(self.m_question[-1]),
                        self.get_int('config/preferred_instrument_velocity'))
    def play_all_notes(self):
        if self.q_status == const.QSTATUS_NO:
            return
        s = r"\staff{"
        for n in self.m_question:
            s = s + " " + n
        s = s + "}"
        track = mpd.music_to_track(s, self.get_int('config/preferred_instrument_velocity'))
        track.prepend_patch(0, self.get_int('config/preferred_instrument'))
        soundcard.synth.play_track(track)

class Gui(abstract.Gui):
    def __init__(self, teacher, window):
        abstract.Gui.__init__(self, teacher, window, no_notebook=1)
        self.set_size_request(400, -1)
        self.config_box.hide()
        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(gtk.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(gtk.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(gtk.FALSE)
        self.practise_box.show_all()
    def new_question(self, widget=None):
        self.m_t.new_question()
        self.g_play_first_note.set_sensitive(gtk.TRUE)
        self.g_play_last_note.set_sensitive(gtk.TRUE)
        self.g_play_all.set_sensitive(gtk.TRUE)
        self.m_t.play_question()
        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()
    def on_end_practise(self):
        self.m_t.end_practise()
        self.g_play_first_note.set_sensitive(gtk.FALSE)
        self.g_play_last_note.set_sensitive(gtk.FALSE)
        self.g_play_all.set_sensitive(gtk.FALSE)