2 minute read

Documentazione: generateRhythmsForState

Descrizione Generale

L’opcode generateRhythmsForState è un componente fondamentale per la generazione di ritmi nel Delta-Engine. Genera valori ritmici che bilanciano due esigenze contrastanti: il livello di movimento spaziale desiderato e la densità di eventi target, tenendo conto della durata armonica.

Firma della Funzione

opcode generateRhythmsForState, i, iiii
    iDensityState, iMovementState, iHarmonicDuration, iTableSize xin
    
    ; ...implementazione...
    
    xout iRhythmTable
endop

Parametri di Input

  • iDensityState (i-rate): valore continuo tra 0 e 2 che rappresenta lo stato di densità
  • iMovementState (i-rate): valore continuo tra 0 e 2 che rappresenta lo stato di movimento spaziale
  • iHarmonicDuration (i-rate): durata armonica in secondi
  • iTableSize (i-rate): dimensione della tabella di ritmi da generare

Output

  • iRhythmTable (i-rate): handle della tabella contenente i valori ritmici generati

Concetti Chiave

Nel Delta-Engine, i valori ritmici hanno un doppio significato:

  1. Temporale: Un ritmo di valore n significa che l’evento successivo verrà generato dopo iHarmonicDuration/n secondi
  2. Spaziale: Valori ritmici più bassi creano movimenti più rapidi nello spazio, valori più alti creano movimenti più lenti o statici

Esiste anche una relazione tra ritmi e densità:

  • Ritmi bassi + durata armonica lunga = sovrapposizione moderata
  • Ritmi alti + durata armonica lunga = sovrapposizione alta
  • Ritmi bassi + durata armonica breve = sovrapposizione bassa

Funzionamento Dettagliato

L’opcode implementa un sofisticato algoritmo che bilanciando movimento e densità:

  1. Normalizzazione degli Stati
    iMovementNormalized = limit(iMovementState / 2, 0, 1)
    iDensityNormalized = limit(iDensityState / 2, 0, 1)
    
  2. Mappatura del Movimento a Range Ritmici
    iMovementFactor = 1 - (iMovementNormalized ^ 1.5)
    iMinRhythm = 1 + iMovementFactor * 7
    iMaxRhythm = 4 + iMovementFactor * 16
    

    Questo crea una relazione inversa:

    • Movimento 0 (statico) → ritmi alti (8-20)
    • Movimento 2 (dinamico) → ritmi bassi (1-4)
  3. Calcolo degli Eventi Per Secondo basato sulla Densità
    iDensityFactor = iDensityNormalized ^ 1.2
    iEventsPerSecond = 0.3 + (iDensityFactor * 2.2)
    

    Questo crea una relazione diretta:

    • Densità 0 (sparsa) → 0.3 eventi/sec
    • Densità 2 (densa) → 2.5 eventi/sec
  4. Calcolo del Ritmo Target per la Densità Desiderata
    iTargetAvgRhythm = iHarmonicDuration * iEventsPerSecond
    

    Questa è la formula chiave che traduce densità e durata armonica in ritmi concreti.

  5. Bilanciamento tra Movimento e Densità
    iRhythmRangeMidpoint = (iMinRhythm + iMaxRhythm) / 2
    iBlendedTarget = (iTargetAvgRhythm * 0.6) + (iRhythmRangeMidpoint * 0.4)
    

    Questo compromesso (60% densità, 40% movimento) garantisce che entrambi i fattori influenzino i valori ritmici.

  6. Aggiustamento del Range Ritmico
    iFinalMin = limit(iBlendedTarget * 0.8, iMinRhythm, iMaxRhythm)
    iFinalMax = limit(iBlendedTarget * 1.2, iMinRhythm, iMaxRhythm)
    
  7. Adattamento della Variazione in base alla Densità
    iVariationFactor = 1 - (iDensityNormalized * 0.5)
    

    Alta densità → meno variazione (più coerenza) Bassa densità → più variazione (più libertà)

  8. Generazione dei Valori Ritmici
    while iIdx < iTableSize do
        iRhythmValue = random(iFinalMin, iFinalMax)
        iRhythmValue = round(iRhythmValue)
        tabw_i iRhythmValue, iIdx, iRhythmTable
        iIdx += 1
    od
    

Esempi di Risultati

Stato Durata Armonica Range Ritmico Eventi/Sec Sovrapposizione
D0, M0 (S/S) 60s 8-12 0.3 9
D0, M2 (S/D) 60s 1-3 0.3 9
D2, M0 (D/S) 5s 8-12 2.5 6
D2, M2 (D/D) 5s 1-3 2.5 6
D1, M1 (medio) 30s 4-8 1.0 15

Legenda: D=Densità, M=Movimento, S=Sparso/Statico, D=Denso/Dinamico

Utilizzo nel Sistema

Questo opcode viene utilizzato:

  1. Durante la generazione di nuovi comportamenti musicali
  2. Durante le transizioni tra stati sonori, generando tabelle di ritmi che evolvono gradualmente
  3. In combinazione con mapDensityToHarmonicDuration per creare una coerenza tra densità, movimento e tempo

Considerazioni Musicali

  • Bilanciamento dell’intenzione compositiva: Permette di conciliare esigenze contrastanti (es. movimento veloce ma densità bassa)
  • Complessità emergente: I ritmi generati creano pattern complessi quando più comportamenti si sovrappongono
  • Transizioni fluide: Durante le transizioni di stato, i ritmi evolvono in modo graduale e musicale