/* -*- c-basic-offset: 2; indent-tabs-mode: nil; -*- */
/*
* FreeDots -- MusicXML to braille music transcription
*
* Copyright 2008-2010 Mario Lang All Rights Reserved.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as
* published by the Free Software Foundation.
*
* This code 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 (a copy is included in the LICENSE.txt file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License
* along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This file is maintained by Mario Lang <mlang@delysid.org>.
*/
package freedots.music;
import java.util.ArrayList;
import java.util.List;
/** A chord limited to notes belonging to a particular staff.
* <p>
* In our current model, a chord belongs to a part and can potentially
* span across staves. This is a property we inherited
* from the structure of MusicXML documents.
* <p>
* However, in braille music a chord generally only belongs to a particular
* voice of a particular staff because vertical alignment of several staves
* or voices is usually not possible.
* @see freedots.music.VoiceChord
*/
@SuppressWarnings("serial")
public final class
StaffChord extends AbstractChord<RhythmicElement> implements StaffElement {
private int staffNumber;
public StaffChord(final RhythmicElement initialNote) {
super(initialNote);
this.staffNumber = initialNote.getStaffNumber();
}
private Staff staff = null;
public Staff getStaff() { return staff; }
public void setStaff(Staff staff) {
this.staff = staff;
for (StaffElement element:this) element.setStaff(staff);
}
public int getStaffNumber() { return staffNumber; }
/* FIXME: Seems inappropriate to have to impelement this */
public boolean isRest() { return false; }
public List<VoiceElement> getVoiceChords() {
List<VoiceElement> chords = new ArrayList<VoiceElement>();
VoiceChord currentVoiceChord = new VoiceChord(get(0));
chords.add(currentVoiceChord);
for (int index = 1; index < size(); index++) {
RhythmicElement note = get(index);
String noteVoiceName = note.getVoiceName();
if ((noteVoiceName == null && currentVoiceChord.getVoiceName() == null)
|| (noteVoiceName != null
&& noteVoiceName.equals(currentVoiceChord.getVoiceName()))) {
currentVoiceChord.add(note);
} else {
currentVoiceChord = new VoiceChord(note);
chords.add(currentVoiceChord);
}
}
for (int index = 0; index < chords.size(); index++)
if (chords.get(index) instanceof VoiceChord) {
VoiceChord voiceChord = (VoiceChord)chords.get(index);
if (voiceChord.size() == 1) chords.set(index, voiceChord.get(0));
}
return chords;
}
}