Analizzatore
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
- Reset dei contatori
- Azzera contatori per eventi attivi e movimento spaziale
- Reset delle tabelle di distribuzione armonica
- Scansione degli eventi attivi
- Itera attraverso
gi_Index
eventi nella composizione - Identifica quali eventi sono attivi al tempo corrente
- Itera attraverso
- Analisi degli eventi attivi
- Conteggio eventi simultanei
- Calcolo movimento spaziale basato sui ritmi
- Tracciamento distribuzione ottave/registri
- Calcolo metriche armoniche
- Densità armonica (frazione di ottave attive)
- Dispersione ottave (complemento della densità)
- Centroide spettrale (media pesata delle ottave)
- Movimento spaziale medio
- Aggiornamento variabili globali
- Memorizza i valori per uso da parte del sistema di transizione
- 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
- Determinazione dell’indice temporale
- Calcola l’indice nella memoria basato sul tempo corrente
- Memorizzazione dati di sovrapposizione
- Salva i dati correnti di sovrapposizione nella memoria
- Memorizzazione dati armonici
- Registra metriche armoniche nella memoria temporale
- Determinazione dello stato
- Classifica il momento attuale in uno dei 27 stati possibili
- Aggiornamento storia degli stati
- Aggiorna buffer circolare degli stati recenti
- 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:
- Reattivo ai cambiamenti istantanei nella texture musicale
- Coerente nell’evoluzione a lungo termine della composizione
- 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.