Issue 123 in mingus: enhancement: accommodate_note()

0 views
Skip to first unread message

min...@googlecode.com

unread,
May 14, 2013, 10:51:03 PM5/14/13
to mingus...@googlegroups.com
Status: New
Owner: ----
Labels: Type-Defect Priority-Medium

New issue 123 by OrtalisM...@gmail.com: enhancement: accommodate_note()
http://code.google.com/p/mingus/issues/detail?id=123

The add_notes() function for adding notes to Tracks did not allow for
adding note durations which would tie into subsequent bars (because the
place_notes() function for a Bar, without any context of a Track, could not
allow it), so I wrote a function which will accommodate for values which
would not fit into the current bar of the track and adds as many bars as
needed to fit the value into the track. It also updates current_beat so
that the next note added will be placed at the correct beat. I think the
add_notes() function could have some issues beyond this limitation, so
using this might be a better alternative. If any bugs are found please post
a comment or solution - the project managers haven't communicated with me,
so I haven't been able to officially submit a contribution.

This is the function, you can copy and paste it into your Track.py file or
download the attachment and replace the file entirely if you want:

def accommodate_note(self, note, duration = None):
"""Adds the given note to the Track while adding enough bars to the
track to accommodate the duration value, allowing for notes to tie
into subsequent bars."""

if self.instrument != None:
if not(self.instrument.can_play_notes(note)):
raise InstrumentRangeError,\
"Note '%s' is not in range of the instrument (%s)"\
% (note, self.instrument)

if duration == None:
duration = 4

if len(self.bars) == 0:
self.bars.append(Bar())
last_bar = self.bars[-1]

if self.bars[-1].space_left() != 0:
# place as much of the duration value as will fit in the bar
value_left = self.bars[-1].value_left()
cur_beat = self.bars[-1].current_beat
self.bars[-1].place_notes(note, value_left)
value_needed = value.subtract(duration, value_left)
else:
cur_beat = self.bars[-1].current_beat
value_needed = duration

# save to assign to current_beat at end to properly set up the position
the subsequent note entry
next_beat = 1.0/value_needed

# add a bar and see how much of the duration value it will accommodate
bars_added = 0
self.add_bar(Bar(self.bars[-1].key, self.bars[-1].meter))
value_bar = self.bars[-1].value_left()
bars_added+=1

# add additional bars as needed to accommodate the duration value
while 1.0/value_needed > 1.0/value_bar:
self.add_bar(Bar())
self.bars[-1].set_meter(self.bars[-2].meter)
value_needed = value.subtract(value_needed, value_bar)
bars_added+=1

# change the note duration now that there are enough bars to fit the full
value
if self.bars[-(bars_added+1)].change_note_duration(cur_beat, duration):
self.bars[-1].current_beat = next_beat
return True
else:
return False

Attachments:
Track.py 8.4 KB

--
You received this message because this project is configured to send all
issue notifications to this address.
You may adjust your notification preferences at:
https://code.google.com/hosting/settings
Reply all
Reply to author
Forward
0 new messages