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()
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'))) )
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'))))
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
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
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
def notename_to_ylinepos(n, clef): n = MusicalPitch.new_from_notename(n) i = n.steps() return self.steps_to_ylinepos(i)
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
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()
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