Pre-release · repository presto pubblici

Un solo framework per ogni applicazione musicale.

SHUFFLE Framework — Sound HUge a Framework For Live Electronics — offre a spettacoli dal vivo, DAW, plugin, strumenti, notazione, didattica e ricerca gli stessi core in C++20 puro, costruiti con l’affidabilità che serve sul palco, su cinque piattaforme e sul web.

  • Spettacoli dal vivo
  • Basi e backing track
  • Cue teatrali
  • DAW
  • Plugin
  • Sintetizzatori
  • Campionatori
  • DJ e remix
  • Notazione
  • Studio e ear training
  • Live coding
  • Didattica
  • Ricerca
  • Musica in rete
  • Installazioni
  • Embedded
  • Strumenti musicali con AI
Perché SHUFFLE Framework

Fatto per il momento in cui deve funzionare.

Quello che un framework audio generico lascia a te — scalette che scorrono senza un buco, show control, timecode, routing per nome, un livello di comandi per ogni telecomando — specificato prima, testato a fondo e abbastanza piccolo da poterlo leggere.

Ogni applicazione musicale

Spettacoli dal vivo, DAW, plugin, sintetizzatori, app per DJ e per lo studio, notazione, installazioni e strumenti di ricerca prendono i core che servono. Nessuna parte generica dà per scontato un palco.

Tempo reale da palco

Il codice del thread audio porta SHUFFLE_RT e lo controlla il compilatore: niente allocazioni, lock, I/O o eccezioni. I test del motore girano anche sotto RealtimeSanitizer.

Apache-2.0, nessun vincolo

Permissivo dai core agli adapter: miniaudio, libremidi, codec permissivi, hosting CLAP, VST3, LV2 e AU. JUCE e Tracktion sono backend opzionali, mai obbligatori.

Cinque piattaforme e il web

Windows, macOS, Linux, iOS e Android, con WebAssembly in CI. Nei core nessun #ifdef di piattaforma, nessun loop modale e nessun I/O bloccante sul thread dei messaggi.

Un solo livello di comandi

Ogni azione dell’utente è un comando con uno schema. Pulsanti, pedali MIDI, OSC, una pagina sul telefono, script e assistenti AI inviano gli stessi comandi e leggono gli stessi snapshot.

Prima la specifica

Ogni dominio ha una specifica di comportamento con requisiti numerati. I test li citano, così una sola ricerca trova specifica, codice e test di un comportamento.

21core in C++20 puro, solo libreria standard
2.300+requisiti numerati in 23 specifiche
3.000+casi di test, core testabili in millisecondi
6target di CI: cinque piattaforme e WebAssembly
0singleton, variabili globali o service locator

shuffle_engine, ottobre 2026.

La finestra di regia di Score Sync durante il cue 1M3 Night Run: timecode 01:00:41:09, battuta 22 movimento 7 in 7/8 a 140 BPM, il cue successivo 1M4 Arrival fra 29 movimenti, una mappa del tempo con quattro cue, l’elenco dei cue e i look per il pubblico.

Immagini scritte dall’applicazione stessa (score_sync --gallery), non mock-up.

Showcase 01 · Score Sync

L’immagine agganciata alla musica.

Una sessione di musica per film costruita esattamente come la costruirebbe chi sviluppa un’applicazione, con le API pubbliche: scaletta, motore, comandi, UI bridge e tema di shuffle_engine, con video ed effetti di shuffle_media.

  • Precisione al fotogramma su una mappa del tempoIl tempo cambia 96, 140, 84 rallentando fino a 60, il metro 4/4, 7/8, 3/4; la verifica headless misura un errore di sincronia di 0 fotogrammi.
  • Un click di cui fidarsiAccurato al campione con una battuta di attacco, sul motore del framework sopra miniaudio.
  • Lo schermo del direttore, generatoStreamer, punch, conti alla rovescia e marcatori dei cue prodotti da comandi a partire dalla mappa del tempo e dall’elenco dei cue.
  • L’immagine per il pubblico, elaborata dal vivoUn look per ogni cue sulla GPU, che si trasforma nell’arco di una battuta e respira a ogni movimento.
  • Un solo livello di comandi per tuttiLa finestra di regia, la pagina sul telefono e lo script dimostrativo inviano gli stessi comandi.

Oggi gira su Windows

Prossime showcase02 Pro Meter03 Live Set04 Visual Live05 MPE Synth06 Stage CuesTutte e dodici →
Moduli

Un framework a moduli, non un monolite.

I core puri contengono la logica; piccole porte li collegano ai dispositivi; gli adapter implementano le porte. Porta un solo core nel tuo processBlock, oppure l’intero motore con i suoi comandi e l’UI bridge.

ProntoIn corsoSpecificatoPrevisto

Spettacolo e controllo core

  • setlistBrani pronti in anticipo, passaggi senza buchi, modalità spettacolo
  • cuesCue list teatrali: attese, dissolvenze, gruppi, GO
  • showcontrolMIDI, MSC, OSC, timecode e azioni di rete
  • routingEndpoint con nome che sopravvivono al cambio di interfaccia
  • midiGate delle note, panic, learn, traduzione MIDI 2.0
  • commandsAnnullamento, piani, schemi, profili, modalità spettacolo

Tempo e sincronia core

  • timeUnità come tipi, mappe del tempo, griglie di lancio
  • timecodeSMPTE a undici frequenze, MTC e LTC, inseguimento
  • syncProtocollo aperto di sincronia di tempo, battuta e fase
  • tempoStima del tempo, click e analisi delle battute

Audio e DSP core

  • engineGrafo audio proprio, bus, mandate, scambio atomico
  • dspFiltri, oscillatori, dinamica, sicuri in tempo reale
  • synthVoci, MPE, campionatore, modulazione
  • loudnessEBU R128, true peak, misuratori
  • formatsWAV, AIFF, FLAC, Ogg, MP3 dagli standard
  • editEditing non distruttivo, ogni modifica un comando

Rete core

  • netaudioAES67, RAVENNA, ST 2110-30, follower PTP
  • redundancySalute degli stream, failover in dissolvenza
  • oscOSC 1.0 e 1.1, bundle, invio programmato
  • resampleRicampionatore in tempo reale, identico al bit a rapporto 1
  • remoteScoperta e controllo remoto di uno spettacolo

Interfaccia core

  • ui_modelView model senza toolkit: timeline, mixer, piano roll
  • ui_themeDeep Field, Nightjar, Monolith; contrasto calcolato
  • ui_bridgeComandi e stato dal vivo per UI web o native

Adapter senza JUCE adapter

  • miniaudioDispositivi audio per il motore
  • libremidiDispositivi MIDI 1.0 e 2.0
  • plugin_hostHosting CLAP, VST3, LV2 e AU
  • codecsFLAC, Vorbis, Opus, MP3
  • platformLoop di controllo, timer, file, impostazioni
  • net_websocketWebSocket e HTTP per l’UI bridge

Satelliti repository

  • shuffle_juceAdapter JUCE 9 in uso; Tracktion in corso
  • shuffle_mediaVideo ed effetti video su GPU, prima su Windows
  • shuffle_aiCompiti di AI su audio.cpp; modelli specificati
  • shuffle_pythonBinding nativi e un client remoto
  • shuffle_studioApplicazioni costruite senza codice
  • shuffle_protocolsMCP, OSCQuery, web, Companion
  • shuffle_embeddedRaspberry Pi, Elk Audio OS, Yocto
Il codice

Lo colleghi tu. Non parte nulla finché non lo crei.

Niente singleton e niente avvii nascosti: il tuo main() costruisce gli adapter del backend, li passa ai core che ne hanno bisogno e distrugge tutto in ordine inverso.

examples/miniaudio/play/main.cpp
// Backend side: control loop, clock, processing threads.
MainLoop loop;
net_sockets::SteadyClock clock;
miniaudio::OsProcessingThreads threads (2);

// The engine and its device callback.
engine::Engine engine ({ clock, &threads });
miniaudio::EngineAudioCallback callback (engine);

// Sine -> Gain (-12 dB) -> device output channels 0 and 1.
engine::Graph g;
const auto sine = engine.newNodeId();
const auto gain = engine.newNodeId();
const auto out = engine.newNodeId();
g.nodes = { engine::sourceNode (sine, "Sine", std::make_shared<Sine> (440.0), 2),
            engine::processorNode (gain, "Gain",
                std::make_shared<engine::GainProcessor> (0.25f), 2, 2),
            engine::sinkNode (out, "Main Out",
                std::make_shared<engine::DeviceOutput> (0), 2) };
g.edges = { engine::audioEdge (engine.newEdgeId(), sine, gain),
            engine::audioEdge (engine.newEdgeId(), gain, out) };

if (const auto r = engine.setGraph (g); ! r.ok)
{
    for (const auto& p : r.problems)
        std::printf ("problem: %s\n", p.message.c_str());
    return 1;
}

auto devices = std::make_unique<miniaudio::MiniaudioDevices> (loop, callback);
  1. Le porte nel costruttoreIl motore riceve un orologio e i thread di elaborazione; un test gli passa dei fake in poche righe, senza scheda audio.
  2. Tempo reale, verificato dal compilatoreSHUFFLE_RT marca il codice del thread audio; con i controlli attivi, una funzione marcata che alloca, prende un lock o lancia un’eccezione fa fallire la build.
  3. Gli errori sono valoriUn grafo che non può girare torna indietro come elenco di problemi, e ogni messaggio dice come risolverlo.
  4. Compilato ed eseguito dalla CIOgni esempio gira a ogni modifica, quindi il codice che copi corrisponde sempre all’API attuale.
Per chi usa JUCE

Tieni il tuo progetto JUCE. Aggiungi quello che gli manca.

La tua applicazione o il tuo plugin resta un progetto JUCE e SHUFFLE Framework entra come libreria, un livello alla volta. Il framework è Apache-2.0 e non aggiunge obblighi copyleft; JUCE mantiene la sua licenza.

Livello a

Core puri nel tuo processBlock

Chiama dsp, synth, time, timecode e loudness dal tuo codice audio, rispettando le regole del tempo reale.

solo shuffle_engine · qualsiasi JUCE che compili in C++20
Livello b

Il motore del framework

Il motore come callback sul tuo juce::AudioDeviceManager; ogni azione un comando per pulsanti, telecomandi e AI; cue list, scalette e UI bridge.

shuffle_engine + shuffle_juce (JUCE 9)
Livello c

Lasciare JUCE, se vuoi

La stessa applicazione sugli adapter senza JUCE — platform, miniaudio, libremidi, hosting dei plugin — sostituiti una porta alla volta nella composition root.

altri adapter, stessi core
CMakeLists.txt · il livello a è una riga
add_subdirectory (JUCE)                                   # as before
add_subdirectory (../shuffle_engine shuffle_engine)       # or FetchContent / find_package

target_link_libraries (MyPlugin PRIVATE
    juce::juce_audio_utils                                # as before
    shuffle::dsp shuffle::synth shuffle::time)
AI e Python

Un solo catalogo per persone, telecomandi e modelli.

Ogni comando ha un descrittore: un nome puntato stabile, un riassunto di una riga, parametri tipizzati con intervalli e unità, frasi d’esempio in inglese e in italiano e un livello di rischio. Da qui nascono gli schemi e gli elenchi di strumenti che usano telecomandi e modelli.

  • Modelli piccoli in locale e modelli grandiI profili restringono il catalogo, vincolano l’output con grammatiche e inviano un comando per turno; le frasi più comuni non hanno bisogno di alcun modello.
  • Nomi, non identificatori“Abbassa il click a meno 6 dB” trova la traccia per nome; se il nome è ambiguo il core lo dice, invece di tirare a indovinare.
  • Compiti di AI dietro le porteVoce per i cue parlati, trascrizione, separazione delle stem e conversione da audio a MIDI, in locale su audio.cpp in shuffle_ai.
  • PythonSpecificatoshuffle-engine espone i core puri; shuffle-remote pilota un’applicazione in esecuzione con gli stessi comandi e snapshot.
  • Costruito con gli agenti di programmazioneAGENTS.md, llms.txt e le specifiche numerate danno la mappa a un assistente; i controlli del repository e i test di contratto ne intercettano gli errori.
mixer.set_track_gainrischio · live
Riassunto
Imposta il guadagno di una traccia.
Gruppi
mixer, live
Parametri
track riferimento a una traccia, obbligatorio
gain_db reale, dB, −60 … +12, obbligatorio
Esempi
click to -6
set the click track to minus 6 dB
abbassa il click a -6
Generati dal catalogoJSON SchemaMCP toolsGBNF grammarOSCQueryOpenAPICompanion
Studio · in progettazione

Crea un’app musicale senza scrivere codice.

Otto fader e un pulsante GO su un tablet, una pagina per studiare con il click, una cue list con il timecode a cifre grandi: trascini i widget sulle pagine, colleghi ciascuno a un comando e allo stato dal vivo, scrivi la logica dello spettacolo in frasi. Il suo Player esegue il risultato su desktop, mobile e browser, e chi sviluppa può esportarlo come progetto C++.

Regola quando premo il pedale e la modalità spettacolo è attiva allora passa al brano successivo

Specificato · ancora senza codice

Roadmap

Siamo all’inizio, e si corre.

Le percentuali contano i requisiti specificati e implementati, non le righe di codice. La pagina di ogni modulo dice cosa è pronto e cosa arriva.

Fondamenta: repository, licenza, CI, documentazione, CMake
100%
Core di base: base, timecode, time, commands
100%
App musicali generiche: dsp, synth, engine, edit
93%
Audio in rete e ridondanza
90%
Motore live: scaletta, show control, cue
88%
Interfaccia utente
73%
Adapter: JUCE, Tracktion, protocolli
65%
Indipendenza: uno stack di backend permissivo
45%
AI, didattica e ricerca
25%
  1. Score SyncOra: la prima showcase gira su Windows
  2. v0.1.0Poi: la prima release con tag
  3. Pro Meter · Live Set · Visual LiveLe prossime showcase, in quest’ordine
  4. Studio e PlayerPiù avanti: le applicazioni come documenti
  5. Python, protocolli, embeddedPiù avanti: i satelliti a partire dalle specifiche
Qualità

Costruito con la qualità in mente.

Qualità che puoi verificare. Ogni comportamento è un requisito numerato, ogni requisito è collegato ai suoi test, e il report mostra cosa passa e cosa è ancora aperto.

Scopri come misuriamo la qualità
2.255requisiti verificati da test che passano
89,3%delle righe coperte dai test
0test falliti su 4 job di test
3sanitizer: ASan, UBSan, RealtimeSanitizer

Dal report di qualità di shuffle_engine 0.1.0, 10 ottobre 2026.

In arrivo

Ci sarai quando si alza il sipario.

I repository restano privati mentre prende forma la prima release. Download, sito della documentazione e lista d’iscrizione arriveranno insieme; per ora non c’è nulla da installare.

Non c’è ancora un modulo d’iscrizione: il pulsante apre un messaggio per shuffleframework@gmail.com nella tua app di posta, e riceverai un avviso quando i repository apriranno. Questo sito non usa cookie e non carica nulla da altri server.