Voice class
Represents a voice in polyphonic notation.
In polyphonic music, multiple independent melodic lines (voices) are notated on the same staff. Each voice is typically distinguished by:
- Stem direction (voice 1: up, voice 2: down)
- Horizontal offset (the stem-down voice shifted right on unisons/seconds)
- Different beaming groups
Examples:
- Bach fugues (3-4 voices on one staff)
- Piano music (2 voices per hand)
- Guitar fingerstyle (melody + accompaniment)
- Counterpoint exercises
Convention (Gould, Behind Bars, "Two or more parts on a staff"):
- Odd voices (1, 3): stems up, no horizontal offset
- Even voices (2, 4): stems down, offset to the right when they collide
A Voice does not mutate the elements it receives: Note.voice is
final, so the voice number must be set when the note is constructed.
Use elementsCarryVoiceNumber / validate to check that this was done.
Constructors
-
Voice({required int number, List<
MusicalElement> ? elements, String? name, StemDirection? forcedStemDirection, double? horizontalOffset, String? color}) -
Voice.voice1({List<
MusicalElement> ? elements, String? name}) -
Factory: Create voice 1 (top voice, stems up)
factory
-
Voice.voice2({List<
MusicalElement> ? elements, String? name}) -
Factory: Create voice 2 (bottom voice, stems down, offset right)
factory
Properties
-
chords
→ List<
Chord> -
Get all chords in this voice
no setter
- color → String?
-
Color for this voice (optional, for visual distinction)
final
-
elements
→ List<
MusicalElement> -
Musical elements in this voice (notes, rests, chords)
final
- elementsCarryVoiceNumber → bool
-
True when every Note/Chord in this voice already declares
voice == number.no setter - forcedStemDirection → StemDirection?
-
Preferred stem direction for this voice
final
- hashCode → int
-
The hash code for this object.
no setterinherited
- hasNotes → bool
-
Check if this voice contains any notes (not just rests)
no setter
- horizontalOffset → double?
-
Horizontal offset for collision avoidance (in staff spaces)
final
- name → String?
-
Optional name for the voice (e.g., "Soprano", "Melody")
final
-
notes
→ List<
Note> -
Get all notes in this voice
no setter
- number → int
-
Voice number (1-based)
final
-
rests
→ List<
Rest> -
Get all rests in this voice
no setter
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
Methods
-
add(
MusicalElement element) → void - Add element to this voice.
-
getHorizontalOffset(
double staffSpace) → double - Get horizontal offset for this voice, in pixels.
-
getStemDirection(
) → StemDirection - Get stem direction for this voice.
-
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
toString(
) → String -
A string representation of this object.
inherited
-
validate(
) → List< String> - Checks that the voice number was propagated to the elements.
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited