requiresLedgerLine method
Implementation
List<LedgerLine> requiresLedgerLine(ChantContext ctxt) {
dynamic firstAbove = false;
bool needsAbove = false;
dynamic firstBelow = false;
bool needsBelow = false;
List<LedgerLine> result = [];
int ledgerLinePositionAbove = ctxt.staffLineCount * 2 + 1;
if (notes.isEmpty) return result;
for (var i = 0; i < notes.length; ++i) {
var note = notes[i];
var staffPosition = note.staffPosition;
if (staffPosition >= ledgerLinePositionAbove - 1) {
needsAbove =
needsAbove || staffPosition >= ledgerLinePositionAbove - 0.9;
if (firstAbove == false) {
firstAbove = (i - 1).clamp(0, double.infinity).toInt();
}
if (staffPosition >= ledgerLinePositionAbove) continue;
} else if (staffPosition <= 0) {
needsBelow = needsBelow || staffPosition < -0.1;
if (firstBelow == false) {
firstBelow = (i - 1).clamp(0, double.infinity).toInt();
}
if (staffPosition <= -1) continue;
}
if (needsAbove || needsBelow) {
var endI = i; // Math.abs(staffPosition) >= 4? i : i - 1;
result.add(
LedgerLine(
element:
notes[(firstAbove != false && firstAbove != 0)
? firstAbove
: (firstBelow != false && firstBelow != 0)
? firstBelow
: 0],
endElem: notes[endI],
staffPosition: needsAbove ? ledgerLinePositionAbove : -1,
),
);
firstAbove = firstBelow = needsAbove = needsBelow = false;
}
}
if (needsAbove || needsBelow) {
result.add(
LedgerLine(
element:
notes[(firstAbove != false && firstAbove != 0)
? firstAbove
: (firstBelow != false && firstBelow != 0)
? firstBelow
: 0],
endElem: notes[notes.length - 1],
staffPosition: needsAbove ? ledgerLinePositionAbove : -1,
),
);
}
return result;
}