예제 #1
0
 def f(widget, i):
     added = self.g_rwidget.on_add_item(elems.Note(
         MusicalPitch.new_from_notename("c"),
         Duration(i, 0)))
     if self.g_add_dots_toggle.get_active():
         self.g_rwidget.on_toggle_dots(1)
     if added:
         self.g_rwidget.cursor_next()
     self.g_rwidget.grab_focus()
예제 #2
0
 def f(widget, i):
     added = self.g_rwidget.on_add_item(elems.Note(
         MusicalPitch.new_from_notename("c"),
         Duration(i, 0)))
     if self.g_add_dots_toggle.get_active():
         self.g_rwidget.on_toggle_dots(1)
     if added:
         self.g_rwidget.cursor_next()
     self.g_rwidget.grab_focus()
예제 #3
0
 def new_from_string(string):
     s = string.strip()
     m = re_melodic.match(s)
     if m.end() < len(s) - 1:
         # FIXME: raise ValueError like rest
         raise Note.Exception("characters left in string", string)
     return Note(
         MusicalPitch.new_from_notename("%s%s" % (m.group('notename'),
                                                  m.group('octave'))),
         Duration.new_from_string("%s%s" % (m.group('len'), m.group('dots')))
     )
예제 #4
0
 def new_from_string(string):
     s = string.strip()
     m = re_melodic.match(s)
     if m.end() < len(s) - 1:
         # FIXME: raise ValueError like rest
         raise Note.Exception("characters left in string", string)
     return Note(
         MusicalPitch.new_from_notename(
             "%s%s" % (m.group('notename'), m.group('octave'))),
         Duration.new_from_string("%s%s" %
                                  (m.group('len'), m.group('dots'))))
예제 #5
0
 def on_key_press(self, window, event):
     if not self.m_editable:
         return
     key_dict = {
         Gdk.KEY_1: 1,
         Gdk.KEY_2: 2,
         Gdk.KEY_3: 4,
         Gdk.KEY_4: 8,
         Gdk.KEY_5: 16,
         Gdk.KEY_6: 32,
     }
     if event.keyval in (Gdk.KEY_Right, Gdk.KEY_KP_Right):
         self.cursor_next()
         self.queue_draw()
     elif event.keyval in (Gdk.KEY_Left, Gdk.KEY_KP_Left):
         self.cursor_prev()
         self.queue_draw()
     elif event.keyval == Gdk.KEY_BackSpace:
         self.backspace()
     elif event.keyval in (Gdk.KEY_Delete, Gdk.KEY_KP_Delete):
         self.delete()
     elif event.keyval in key_dict:
         if self.m_input_mode == self.NOTE_INPUT:
             added = self.on_add_item(
                 elems.Note(MusicalPitch.new_from_notename("c"),
                            Duration(key_dict[event.keyval], 0)))
         else:
             assert self.m_input_mode == self.REST_INPUT
             added = self.on_add_item(
                 elems.Rest(Duration(key_dict[event.keyval], 0)))
         if added:
             self.cursor_next()
         self.queue_draw()
         self.grab_focus()
     elif event.keyval == Gdk.KEY_period:
         self.on_toggle_dots(1)
     elif event.keyval == Gdk.KEY_colon:
         self.on_toggle_dots(-1)
     elif event.keyval == Gdk.KEY_t:
         self.on_toggle_tie()
     elif event.keyval == Gdk.KEY_r:
         if self.m_input_mode == self.NOTE_INPUT:
             self.m_input_mode = self.REST_INPUT
         else:
             self.m_input_mode = self.NOTE_INPUT
예제 #6
0
 def on_key_press(self, window, event):
     if not self.m_editable:
         return
     key_dict = {Gdk.KEY_1: 1,
                 Gdk.KEY_2: 2,
                 Gdk.KEY_3: 4,
                 Gdk.KEY_4: 8,
                 Gdk.KEY_5: 16,
                 Gdk.KEY_6: 32,
                 }
     if event.keyval in (Gdk.KEY_Right, Gdk.KEY_KP_Right):
         self.cursor_next()
         self.queue_draw()
     elif event.keyval in (Gdk.KEY_Left, Gdk.KEY_KP_Left):
         self.cursor_prev()
         self.queue_draw()
     elif event.keyval == Gdk.KEY_BackSpace:
         self.backspace()
     elif event.keyval in (Gdk.KEY_Delete, Gdk.KEY_KP_Delete):
         self.delete()
     elif event.keyval in key_dict:
         if self.m_input_mode == self.NOTE_INPUT:
             added = self.on_add_item(
                 elems.Note(MusicalPitch.new_from_notename("c"),
                            Duration(key_dict[event.keyval], 0)))
         else:
             assert self.m_input_mode == self.REST_INPUT
             added = self.on_add_item(elems.Rest(
                 Duration(key_dict[event.keyval], 0)))
         if added:
             self.cursor_next()
         self.queue_draw()
         self.grab_focus()
     elif event.keyval == Gdk.KEY_period:
         self.on_toggle_dots(1)
     elif event.keyval == Gdk.KEY_colon:
         self.on_toggle_dots(-1)
     elif event.keyval == Gdk.KEY_t:
         self.on_toggle_tie()
     elif event.keyval == Gdk.KEY_r:
         if self.m_input_mode == self.NOTE_INPUT:
             self.m_input_mode = self.REST_INPUT
         else:
             self.m_input_mode = self.NOTE_INPUT
예제 #7
0
 def refill_accidentals_info(self, key):
     """Fill the .m_accidentals_info dict with the accidentals
     that exist in the key signature `key`.
     """
     self.m_accidentals_info = {}
     for step in range(MusicalPitch.LOWEST_STEPS, MusicalPitch.HIGHEST_STEPS+1):
         self.m_accidentals_info[step] = 0
     for a in mpdutils.key_to_accidentals(key):
         n = MusicalPitch.new_from_notename(a)
         for oct in range(-4, 7):
             n.m_octave_i = oct
             if n.semitone_pitch() < 128:
                 if a[-4:] == 'eses':
                     self.m_accidentals_info[n.steps()] = -2
                 elif a[-2:] == 'es':
                     self.m_accidentals_info[n.steps()] = -1
                 elif a[-4:] == 'isis':
                     self.m_accidentals_info[n.steps()] = 2
                 else:
                     self.m_accidentals_info[n.steps()] = 1
예제 #8
0
 def notename_to_ylinepos(n, clef):
     n = MusicalPitch.new_from_notename(n)
     i = n.steps()
     return self.steps_to_ylinepos(i)
예제 #9
0
파일: lexer.py 프로젝트: gitGNU/gnu_solfege
 def _next(self):
     # Doing this while loop inside the exception clause is a little
     # faster than using a regular expression.
     try:
         while self.m_string[self.m_idx] in (' ', '\n', '\t'):
             self.m_idx += 1
     except IndexError:
         raise StopIteration
     self.m_last_idx = self.m_idx
     m = self.re_rest.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         resttype, notelen, dots = m.groups()
         numdots = len(dots)
         if notelen:
             notelen = int(notelen)
         else:
             notelen = 0
             if numdots:
                 raise LexerError(
                     'Need a digit before dots. Write "%(goodcode)s", not "%(badcode)s".'
                     % {
                         'badcode':
                         m.group().strip(),
                         'goodcode':
                         '%s%i%s' % (resttype, self.m_notelen.m_nh, dots)
                     }, self)
         if notelen is 0:
             return self.REST, RestRequest(None, None)
         else:
             self.m_notelen = Duration(notelen, numdots)
             return self.REST, RestRequest(notelen, numdots)
     m = self.re_skip.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         IGN1, skiplen, dots = m.groups()
         numdots = len(dots)
         if skiplen:
             skiplen = int(skiplen)
             self.m_notelen = Duration(skiplen, numdots)
         else:
             skiplen = 0
             if numdots:
                 raise LexerError(
                     'Need a digit before dots. Write "%(goodcode)s", not "%(badcode)s".'
                     % {
                         'badcode': m.group().strip(),
                         'goodcode': 's%i%s' % (self.m_notelen.m_nh, dots)
                     }, self)
         if skiplen is 0:
             return self.SKIP, SkipRequest(skiplen, numdots)
         else:
             self.m_notelen = Duration(skiplen, numdots)
             return self.SKIP, SkipRequest(skiplen, numdots)
     m = self.re_partial.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         num, dot = m.groups()
         num = int(num)
         dot = len(dot)
         return self.PARTIAL, Duration(num, dot)
     m = self.re_melodic.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         notename, IGN1, IGN2, notelen, dots = m.groups()
         numdots = len(dots)
         if notelen:
             notelen = int(notelen)
             self.m_notelen = Duration(notelen, numdots)
         else:
             notelen = 0
             if dots:
                 raise LexerError(
                     'Need a digit before dots. Write "%(goodcode)s", not "%(badcode)s".'
                     % {
                         'badcode':
                         m.group().strip(),
                         'goodcode':
                         '%s%i%s' % (notename, self.m_notelen.m_nh, dots)
                     }, self)
         n = MusicRequest(notename, notelen, numdots)
         return self.NOTE, n
     m = self.re_staff.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.STAFF, None
     m = self.re_rhythmstaff.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.RHYTHMSTAFF, None
     m = self.re_voice.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.VOICE, None
     m = self.re_relative.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.RELATIVE, MusicalPitch.new_from_notename(m.group(1))
     m = self.re_clef_quoted.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.CLEF, m.group(1)
     m = self.re_clef.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.CLEF, m.group(1)
     m = self.re_stem_updown.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         d = [const.UP, const.DOWN, const.BOTH][['Up', 'Down',
                                                 'Both'].index(m.group(2))]
         return self.STEMDIR, d
     m = self.re_tuplet_updown.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         d = [const.UP, const.DOWN, const.BOTH][['Up', 'Down',
                                                 'Both'].index(m.group(2))]
         return self.TUPLETDIR, d
     m = self.re_transpose.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.TRANSPOSE, MusicalPitch.new_from_notename(m.group(1))
     m = self.re_time.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.TIME, elems.TimeSignature(int(m.group(1)),
                                               int(m.group(2)))
     m = self.re_key.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.KEY, (m.group(1), m.group(2))
     m = self.re_times.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.TIMES, Rat(int(m.groups()[0]), int(m.groups()[1]))
     if self.m_idx == len(self.m_string):
         raise StopIteration
     self.m_idx += 1
     return self.m_string[self.m_idx - 1], None
예제 #10
0
 def notename_to_ylinepos(n, clef):
     n = MusicalPitch.new_from_notename(n)
     i = n.steps()
     return self.steps_to_ylinepos(i)
예제 #11
0
 def f(widget, i):
     self.g_rwidget.on_add_item(elems.Note(
         MusicalPitch.new_from_notename("c"),
         Duration(i, 0)))
     self.g_rwidget.grab_focus()
예제 #12
0
파일: lexer.py 프로젝트: tcamundsen/solfege
 def _next(self):
     # Doing this while loop inside the exception clause is a little
     # faster than using a regular expression.
     try:
         while self.m_string[self.m_idx] in (' ', '\n', '\t'):
             self.m_idx += 1
     except IndexError:
         raise StopIteration
     self.m_last_idx = self.m_idx
     m = self.re_rest.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         resttype, notelen, dots = m.groups()
         numdots = len(dots)
         if notelen:
             notelen = int(notelen)
         else:
             notelen = 0
             if numdots:
                 raise LexerError('Need a digit before dots. Write "%(goodcode)s", not "%(badcode)s".' % {
                     'badcode': m.group().strip(),
                     'goodcode': '%s%i%s' % (resttype, self.m_notelen.m_nh, dots)
                     },
                     self)
         if notelen is 0:
             return self.REST, RestRequest(None, None)
         else:
             self.m_notelen = Duration(notelen, numdots)
             return self.REST, RestRequest(notelen, numdots)
     m = self.re_skip.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         IGN1, skiplen, dots = m.groups()
         numdots = len(dots)
         if skiplen:
             skiplen = int(skiplen)
             self.m_notelen = Duration(skiplen, numdots)
         else:
             skiplen = 0
             if numdots:
                 raise LexerError('Need a digit before dots. Write "%(goodcode)s", not "%(badcode)s".' % {
                     'badcode': m.group().strip(),
                     'goodcode': 's%i%s' % (self.m_notelen.m_nh, dots)
                     }, self)
         if skiplen is 0:
             return self.SKIP, SkipRequest(skiplen, numdots)
         else:
             self.m_notelen = Duration(skiplen, numdots)
             return self.SKIP, SkipRequest(skiplen, numdots)
     m = self.re_partial.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         num, dot = m.groups()
         num = int(num)
         dot = len(dot)
         return self.PARTIAL, Duration(num, dot)
     m = self.re_melodic.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         notename, IGN1, IGN2, notelen, dots = m.groups()
         numdots = len(dots)
         if notelen:
             notelen = int(notelen)
             self.m_notelen = Duration(notelen, numdots)
         else:
             notelen = 0
             if dots:
                 raise LexerError('Need a digit before dots. Write "%(goodcode)s", not "%(badcode)s".' % {
                     'badcode': m.group().strip(),
                     'goodcode': '%s%i%s' % (notename, self.m_notelen.m_nh, dots)
                     }, self)
         n = MusicRequest(notename, notelen, numdots)
         return self.NOTE, n
     m = self.re_staff.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.STAFF, None
     m = self.re_rhythmstaff.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.RHYTHMSTAFF, None
     m = self.re_voice.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.VOICE, None
     m = self.re_relative.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.RELATIVE, MusicalPitch.new_from_notename(m.group(1))
     m = self.re_clef_quoted.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.CLEF, m.group(1)
     m = self.re_clef.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.CLEF, m.group(1)
     m = self.re_stem_updown.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         d = [const.UP, const.DOWN, const.BOTH][['Up', 'Down', 'Both'].index(m.group(2))]
         return self.STEMDIR, d
     m = self.re_tuplet_updown.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         d = [const.UP, const.DOWN, const.BOTH][['Up', 'Down', 'Both'].index(m.group(2))]
         return self.TUPLETDIR, d
     m = self.re_transpose.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.TRANSPOSE, MusicalPitch.new_from_notename(m.group(1))
     m = self.re_time.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.TIME, elems.TimeSignature(int(m.group(1)), int(m.group(2)))
     m = self.re_key.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.KEY, (m.group(1), m.group(2))
     m = self.re_times.match(self.m_string, self.m_idx)
     if m:
         self.m_idx = m.end()
         return self.TIMES, Rat(int(m.groups()[0]), int(m.groups()[1]))
     if self.m_idx == len(self.m_string):
         raise StopIteration
     self.m_idx += 1
     return self.m_string[self.m_idx - 1], None