4 minute read

Analisi Completa dello Strumento Analizzatore in Delta-Engine

1. Introduzione

Lo strumento Analizzatore rappresenta il sistema percettivo di Delta-Engine, monitorando continuamente l’evoluzione della composizione e fornendo feedback essenziale al sistema di transizione di stato. Questo documento esamina nel dettaglio il suo funzionamento, con particolare attenzione alla doppia temporalità di analisi.

2. Architettura Generale

Analizzatore è uno strumento “always-on” che esegue simultaneamente due tipi di analisi a diverse frequenze temporali:

  • Analisi veloce: Eseguita 10 volte al secondo (10 Hz)
  • Analisi lenta: Tipicamente eseguita ogni secondo (1 Hz)
instr Analizzatore
    ; Analisi della sovrapposizione di eventi - eseguita a k-rate 
    kTrig metro 10  ; 10 Hz per avere una buona risoluzione temporale
    if kTrig == 1 then
        ; Analisi veloce
    endif

    ; Aggiornamento memoria compositiva
    kMemTrig metro 1/gi_memory_resolution
    if kMemTrig == 1 then
        ; Analisi lenta
    endif
endin

3. Analisi Veloce (10 Hz)

Flusso di Esecuzione

  1. Reset dei contatori
    • Azzera contatori per eventi attivi e movimento spaziale
    • Reset delle tabelle di distribuzione armonica
  2. Scansione degli eventi attivi
    • Itera attraverso gi_Index eventi nella composizione
    • Identifica quali eventi sono attivi al tempo corrente
  3. Analisi degli eventi attivi
    • Conteggio eventi simultanei
    • Calcolo movimento spaziale basato sui ritmi
    • Tracciamento distribuzione ottave/registri
  4. Calcolo metriche armoniche
    • Densità armonica (frazione di ottave attive)
    • Dispersione ottave (complemento della densità)
    • Centroide spettrale (media pesata delle ottave)
    • Movimento spaziale medio
  5. Aggiornamento variabili globali
    • Memorizza i valori per uso da parte del sistema di transizione
  6. Memorizzazione nell’array di analisi
    • Salva dati in buffer circolari per analisi successive

Tabelle Coinvolte

Tabella Descrizione Tipo di Accesso
gi_active_octaves Conteggio eventi per ottava Reset e scrittura
gi_active_registers Conteggio eventi per registro Reset e scrittura
gi_octave_register_matrix Matrice distribuzione ottava/registro Reset e scrittura
gi_cumulative_octave_register_matrix Distribuzione cumulativa nel tempo Solo scrittura (incrementale)
gi_analysis_active_events Buffer eventi attivi Scrittura (buffer circolare)
gi_analysis_timepoints Timestamp corrispondenti Scrittura (buffer circolare)

Variabili Globali Aggiornate

Variabile Descrizione
gk_current_overlap Numero di eventi attivi simultaneamente
gk_current_harmonic_density Densità armonica (0-1)
gk_current_octave_spread Dispersione delle ottave (0-1)
gk_current_spectral_centroid Centro di gravità spettrale
gk_current_spatial_movement Livello di movimento spaziale

4. Analisi Lenta (1 Hz)

Flusso di Esecuzione

  1. Determinazione dell’indice temporale
    • Calcola l’indice nella memoria basato sul tempo corrente
  2. Memorizzazione dati di sovrapposizione
    • Salva i dati correnti di sovrapposizione nella memoria
  3. Memorizzazione dati armonici
    • Registra metriche armoniche nella memoria temporale
  4. Determinazione dello stato
    • Classifica il momento attuale in uno dei 27 stati possibili
  5. Aggiornamento storia degli stati
    • Aggiorna buffer circolare degli stati recenti
  6. Memorizzazione nella cronologia completa
    • Registra lo stato nell’archivio temporale completo

Tabelle Coinvolte

Tabella Descrizione Tipo di Accesso
gi_memory_overlap Sovrapposizione eventi nel tempo Scrittura
gi_memory_events Conteggio eventi nel tempo Scrittura
gi_memory_harmonic_density Densità armonica nel tempo Scrittura
gi_memory_octave_spread Dispersione ottave nel tempo Scrittura
gi_memory_spectral_centroid Centroide spettrale nel tempo Scrittura
gi_memory_spatial_movement Movimento spaziale nel tempo Scrittura
gi_state_history_density Buffer circolare stato densità Scrittura
gi_state_history_register Buffer circolare stato registro Scrittura
gi_state_history_movement Buffer circolare stato movimento Scrittura
gi_memory_state_density Storia completa stato densità Scrittura
gi_memory_state_register Storia completa stato registro Scrittura
gi_memory_state_movement Storia completa stato movimento Scrittura

5. Confronto tra Analisi Veloce e Lenta

Caratteristica Analisi Veloce (10 Hz) Analisi Lenta (1 Hz)
Frequenza 10 volte al secondo 1 volta al secondo
Focus Stato istantaneo Evoluzione nel tempo
Tabelle Principalmente istantanee Principalmente storiche
Reset Reset frequente delle tabelle Nessun reset (accumulo)
Utilizzo Feedback immediato Memoria a lungo termine
Consumo CPU Maggiore Minore
Reattività Alta Bassa
Rumore analitico Maggiore Minore (filtraggio)

Perché Servono Entrambe le Frequenze?

Motivi per l’Analisi Veloce:

  • Feedback in tempo reale: Fornisce una visione dettagliata e immediata dello stato attuale
  • Reattività: Permette risposte rapide ai cambiamenti nella texture musicale
  • Precisione temporale: Cattura con accuratezza i momenti di transizione tra eventi
  • Input per decisioni istantanee: Alimenta il sistema di transizione con dati aggiornati

Motivi per l’Analisi Lenta:

  • Memoria compositiva: Crea un archivio regolare della storia della composizione
  • Riduzione del rumore: Filtra variazioni momentanee, evidenziando tendenze significative
  • Efficienza: Riduce il carico computazionale per l’analisi storica
  • Supporto alle decisioni adattive: Fornisce dati per adattamenti basati sulla storia recente

6. Interazioni con Altri Componenti

TransitionController

; In transControllerUtils.udo
opcode recordCurrentState, 0, 0
    ; Legge le variabili globali aggiornate dall'analisi veloce
    iCurDensity = i(gk_current_overlap)
    iCurRegister = i(gk_current_octave_spread)
    iCurMovement = i(gk_current_spatial_movement)
endop

suggestDurationFactor

; In calcDurationFactor.udo
opcode analyzeCompositionMemory, iiii, ii
    ; Legge i dati dalla memoria compositiva (analisi lenta)
    iOverlap table iIdx, gi_memory_overlap
endop

AnalisiFinale

; In AnalisiFinale.orc
instr AnalisiFinale
    ; Esporta dati di analisi in file CSV
    iActiveEvents tab_i iIdx, gi_analysis_active_events
    iTime tab_i iIdx, gi_analysis_timepoints
endin

7. Metriche Chiave Calcolate

Sovrapposizione Eventi

kActiveEventsCount = 0
while kEventIdx < gi_Index do
    if kAttackTime <= kCurrentTime && kAttackTime + kDuration >= kCurrentTime then
        kActiveEventsCount += 1
    endif
od

Densità Armonica

kActiveOctaves = 0
while kOctIdx < $OTTAVE do
    kOctCount tab kOctIdx, gi_active_octaves
    if kOctCount > 0 then
        kActiveOctaves += 1
    endif
od
kHarmonicDensity = kActiveOctaves / $OTTAVE

Centroide Spettrale

kWeightedOctaveSum = 0
kTotalOctaveEvents = 0
while kOctIdx < $OTTAVE do
    kOctCount tab kOctIdx, gi_active_octaves
    kWeightedOctaveSum += kOctIdx * kOctCount
    kTotalOctaveEvents += kOctCount
od
kSpectralCentroid = kWeightedOctaveSum / kTotalOctaveEvents

8. Conclusione

Lo strumento Analizzatore implementa una duplice temporalità di analisi che simula in qualche modo la percezione musicale umana:

  • L’analisi veloce agisce come “percezione immediata”, reagendo rapidamente ai cambiamenti sonori
  • L’analisi lenta funziona come “memoria musicale”, trattenendo e organizzando l’evoluzione compositiva

Questo approccio duale permette a Delta-Engine di essere simultaneamente:

  1. Reattivo ai cambiamenti istantanei nella texture musicale
  2. Coerente nell’evoluzione a lungo termine della composizione
  3. Adattivo in base alla storia compositiva precedente

La separazione tra le due frequenze di analisi rappresenta un compromesso ottimale tra precisione temporale, efficienza computazionale e rilevanza analitica, consentendo al sistema di prendere decisioni informate a diverse scale temporali durante l’evoluzione della composizione algoritmica.