add method

void add(
  1. MusicalElement element
)

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);
}