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.
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.
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.
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.
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.
Permissivo dai core agli adapter: miniaudio, libremidi, codec permissivi, hosting CLAP, VST3, LV2 e AU. JUCE e Tracktion sono backend opzionali, mai obbligatori.
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.
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.
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.
shuffle_engine, ottobre 2026.




Immagini scritte dall’applicazione stessa (score_sync --gallery), non mock-up.
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.
Oggi gira su Windows
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.
setlistBrani pronti in anticipo, passaggi senza buchi, modalità spettacolocuesCue list teatrali: attese, dissolvenze, gruppi, GOshowcontrolMIDI, MSC, OSC, timecode e azioni di reteroutingEndpoint con nome che sopravvivono al cambio di interfacciamidiGate delle note, panic, learn, traduzione MIDI 2.0commandsAnnullamento, piani, schemi, profili, modalità spettacolotimeUnità come tipi, mappe del tempo, griglie di lanciotimecodeSMPTE a undici frequenze, MTC e LTC, inseguimentosyncProtocollo aperto di sincronia di tempo, battuta e fasetempoStima del tempo, click e analisi delle battuteengineGrafo audio proprio, bus, mandate, scambio atomicodspFiltri, oscillatori, dinamica, sicuri in tempo realesynthVoci, MPE, campionatore, modulazioneloudnessEBU R128, true peak, misuratoriformatsWAV, AIFF, FLAC, Ogg, MP3 dagli standardeditEditing non distruttivo, ogni modifica un comandonetaudioAES67, RAVENNA, ST 2110-30, follower PTPredundancySalute degli stream, failover in dissolvenzaoscOSC 1.0 e 1.1, bundle, invio programmatoresampleRicampionatore in tempo reale, identico al bit a rapporto 1remoteScoperta e controllo remoto di uno spettacoloui_modelView model senza toolkit: timeline, mixer, piano rollui_themeDeep Field, Nightjar, Monolith; contrasto calcolatoui_bridgeComandi e stato dal vivo per UI web o nativeminiaudioDispositivi audio per il motorelibremidiDispositivi MIDI 1.0 e 2.0plugin_hostHosting CLAP, VST3, LV2 e AUcodecsFLAC, Vorbis, Opus, MP3platformLoop di controllo, timer, file, impostazioninet_websocketWebSocket e HTTP per l’UI bridgeshuffle_juceAdapter JUCE 9 in uso; Tracktion in corsoshuffle_mediaVideo ed effetti video su GPU, prima su Windowsshuffle_aiCompiti di AI su audio.cpp; modelli specificatishuffle_pythonBinding nativi e un client remotoshuffle_studioApplicazioni costruite senza codiceshuffle_protocolsMCP, OSCQuery, web, Companionshuffle_embeddedRaspberry Pi, Elk Audio OS, YoctoNiente 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.
// 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);/** A sine node: what a node processor looks like (real-time safe, no allocation). */
class Sine final : public engine::NodeProcessor
{
public:
explicit Sine (double hz) : hz_ (hz) {}
void prepare (const engine::NodePrepare& spec) override { rate_ = spec.sampleRate; }
bool process (engine::ProcessContext& ctx) noexcept SHUFFLE_RT override
{
auto& out = ctx.audioOut[0];
const double step = 2.0 * 3.141592653589793 * hz_ / rate_;
for (int k = 0; k < ctx.numSamples; ++k)
{
// A phase from the engine's sample counter: the same at any block size.
const double phase = step * static_cast<double> (ctx.engineSample + k);
float value = 0.0f;
SHUFFLE_RT_ALLOW_BEGIN ("std::sin is pure arithmetic: no allocation, lock or system call")
value = static_cast<float> (std::sin (phase));
SHUFFLE_RT_ALLOW_END
for (int c = 0; c < out.numChannels; ++c)
out.channels[c][k] = value;
}
return true;
}
private:
double hz_;
double rate_ = 48'000.0;
};SHUFFLE_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.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.
processBlockChiama dsp, synth, time, timecode e loudness dal tuo codice audio, rispettando le regole del tempo reale.
Il motore come callback sul tuo juce::AudioDeviceManager; ogni azione un comando per pulsanti, telecomandi e AI; cue list, scalette e UI bridge.
La stessa applicazione sugli adapter senza JUCE — platform, miniaudio, libremidi, hosting dei plugin — sostituiti una porta alla volta nella composition root.
altri adapter, stessi coreadd_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)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.
shuffle-engine espone i core puri; shuffle-remote pilota un’applicazione in esecuzione con gli stessi comandi e snapshot.AGENTS.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 · livetrack riferimento a una traccia, obbligatoriogain_db reale, dB, −60 … +12, obbligatorioclick to -6
set the click track to minus 6 dB
abbassa il click a -6Otto 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++.
Specificato · ancora senza codice
Le percentuali contano i requisiti specificati e implementati, non le righe di codice. La pagina di ogni modulo dice cosa è pronto e cosa arriva.
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.