add method
Adiciona um elemento musical ao compasso.
VALIDAÇÃO RIGOROSA: Se o compasso tiver TimeSignature, valida ANTES de adicionar para garantir que não excede a capacidade do compasso.
Lança MeasureCapacityException se tentar adicionar figura que exceda.
Implementation
void add(MusicalElement element) {
// Verificar se é um elemento que ocupa tempo musical
final elementDuration = _getElementDuration(element);
if (elementDuration > 0) {
// Buscar TimeSignature no compasso ou usar o herdado
final ts = timeSignature ?? inheritedTimeSignature;
if (ts != null) {
// Calcular se há espaço
final currentValue = currentMusicalValue;
final measureCapacity = ts.measureValue;
final afterAdding = currentValue + elementDuration;
// Tolerância para erros de ponto flutuante
const tolerance = 0.0001;
if (afterAdding > measureCapacity + tolerance) {
// PROIBIDO: Excede capacidade!
final excess = afterAdding - measureCapacity;
throw MeasureCapacityException(
'Não é possível adicionar ${element.runtimeType} ao compasso!\n'
'Compasso ${ts.numerator}/${ts.denominator} (capacidade: $measureCapacity unidades)\n'
'Valor atual: $currentValue unidades\n'
'Tentando adicionar: $elementDuration unidades\n'
'Total seria: $afterAdding unidades\n'
'EXCESSO: ${excess.toStringAsFixed(4)} unidades\n'
'❌ OPERAÇÃO BLOQUEADA - Remova figuras ou crie novo compasso!'
);
}
}
}
// Adicionar elemento
elements.add(element);
}