NØISEIT

Brani e condivisione

Il file .noisesong e il link noise://

Cosa contiene un file .noisesong, come il link noise:// lo codifica, e i limiti che tutti e due rispettano.

Un brano esce da NØISE in una di due forme leggibili da una macchina: un file .noisesong (JSON) o un link noise:// (lo stesso JSON, codificato in un URL). Nessuna delle due contiene audio. Tutte e due portano esattamente un brano.

Attenzione

Schema 3, dalla NØISE 0.81, senza compatibilità all'indietro. Un brano è UNA band con UN kit, e una sezione imposta le sue corsie DRUMS e JAM. L'app non legge niente più vecchio dello schema 3: un file con schemaVersion 2 o senza schemaVersion si apre come niente, e una libreria più vecchia viene messa da parte al primo avvio. Questo sito rifiuta un file così al caricamento, con le stesse parole. Apri il brano nell'editor dell'app ed esportalo di nuovo.

Il file .noisesong

ESPORTA, nel pannello BRANI e nell'editor, scrive un documento JSON in UTF-8. L'app registra il tipo di file come nl.weap.noise.song (“NØISE Song”, conforme a public.json, estensione .noisesong), quindi un doppio clic su un file lo apre in NØISE.

La busta

{
  "version": 3,
  "song": { … }
}
CampoTipoSignificato
versioninteroVersione del formato del file; 3 dalla 0.81.
songoggettoIl brano.

Le chiavi sono scritte in ordine alfabetico e con l'indentazione. Le date sono ISO-8601 in UTC senza frazioni di secondo (2026-05-01T12:00:00Z): l'app rifiuta le frazioni di secondo.

L'oggetto song

{
  "id": "6F1A0E9C-3D4E-4B11-9A0B-1C2D3E4F5A6B",
  "name": "Amber Skyline",
  "author": "NØISE",
  "songDescription": "Demo song for the website",
  "style": "rock",
  "kit": "rock.classic",
  "drums": { "feel": "straight", "preset": { "name": "LAID BACK", "energy": 0.45, "swing": 0.2, "humanize": 0.25, "live": 0.35 } },
  "jam": { "intensity": 0.5, "colorLayer": false, "rhythmGuitar": true },
  "tempoHint": 112,
  "grooveSeed": 4422912175377245,
  "schemaVersion": 3,
  "createdAt": "2026-05-01T12:00:00Z",
  "updatedAt": "2026-05-01T12:00:00Z",
  "chart": { … }
}
CampoTipoObbligatorioSignificato
idstringa UUIDsìL'identità del brano. Importare un brano il cui id è già nella libreria non lo unisce mai a quello: l'import riceve un UUID nuovo e diventa un brano nuovo e separato, con l'id originale registrato in sourceId, così la discendenza non si perde.
namestringasìIl nome del brano.
chartoggettosìLo schema degli accordi (sotto).
stylestringanoLo stile JAM dell'intero brano: pop, rock, blues, jazz, hiphop, funk, metal. Assente = rock. Il genere della batteria segue da lì (pop → POP, rock → ROCK, … hiphop → HIP-HOP) e non è un campo a sé. Mentre il brano suona, la band suona la band del brano; i tuoi pannelli DRUMS e JAM tornano quando lasci il brano.
tempoHintnumeronoIl tempo del brano; applicato alla sessione quando il brano si carica.
songDescriptionstringanoNote libere (notes: nel formato testo).
authorstringanoChi l'ha scritto.
kitstringanoL'unico kit JAM dell'intero brano, un id valido per lo stile (pop.strings, rock.classic, metal.stock, …). Assente = il primo kit dello stile. Un kit di un altro stile viene ignorato.
drumsoggettonoLa corsia DRUMS del brano: da cosa parte ogni sezione. Vedi Le corsie.
jamoggettonoLa corsia JAM del brano: lo stesso.
tuningstringanoGuitarTuning.id: standard, dropD, halfStepDown, fullStepDown, dropC, openG, openD, dadgad. Applicata alla sessione quando il brano si carica, come la tonalità e il tempo: non è un suggerimento. Se manca, vale Standard: un brano che non nomina un'accordatura è scritto in Standard, e caricarlo mette la sessione in Standard.
capointeronoIl tasto su cui sta il capotasto del brano, 0–9 (dalla 0.71). Applicato al caricamento come l'accordatura: assente o 0 vuol dire nessun capotasto, e caricare il brano lo toglie. Lo schema resta nella tonalità delle forme; band e rilevatori suonano di tanti tasti più in alto.
grooveSeedinteronoIl seed di groove dell'autore. Ogni scelta che la band tira a sorte (quali battute scritte di basso e pad, i fill, le note di approccio, la frase della batteria, il walking bass verso l'accordo dopo) viene da qui: un brano condiviso suona uguale su ogni Mac e ogni iPad. Assente: un hash stabile dell'id del brano. L'app ne scrive uno quando salvi un brano nuovo e all'esportazione ci mette il seed effettivo, come la tonalità. Un intero sotto 2^53, così ogni lettore JSON, JavaScript compreso, lo legge esatto.
sourceIdstringa UUIDnoIl brano da cui questo è stato importato o derivato (la discendenza dei brani condivisi).
schemaVersioninterosì3. Qualunque cosa più bassa, o assente, non viene letta: né dall'app, né da questo sito.
createdAt, updatedAtdatasìData e ora.

feel, drumStyle, drumEnergy, drumHumanize, jamIntensity, colorLayer e rhythmGuitar non esistono più a livello di brano: stanno dentro drums e jam. Un brano da un'app più nuova non fallisce mai per una chiave in più; le chiavi sconosciute si mantengono in un'andata e ritorno.

Le corsie

Gli stessi due blocchi stanno sul brano (da cosa parte ogni sezione) e su una sezione (cosa dice lei). Ogni campo è facoltativo e significa "non impostato qui": vedi la regola di risoluzione.

drums — cosa dice una sezione al kit:

CampoValoriSignificato
offtrue / falseIl kit tace in questa sezione (spazio da solista).
feelun tag GrooveFeel dalla lista dello stile (straight, halfTime, shuffle, swing, …)Il groove: un feel per la batteria E la band. Un feel che lo stile non offre si risolve nel primo dello stile.
fill.incrash, splash, none, chokeIl piatto sull'uno della sezione. Assente = decide l'arrangiamento dalla transizione. choke viene portato, non ancora suonato (suona come un crash).
fill.outauto, fill, none, break, oppure il nome di un fill (busy, tom roll, fill2, …)Cosa fa il kit in uscita dalla sezione, sull'ULTIMA battuta dell'ultima volta. auto = decide l'arrangiamento; fill = un fill qualunque sia la transizione; none = mai; un nome = quel fill della banca del genere (sconosciuto → auto). break viene portato, non ancora suonato (suona come none).
variationuna lista di paroleGli strati dello stile. Portati dal file; l'app non ha ancora parole per loro.
preset.nameSTOCK, TIGHT, DRIVING, LAID BACK, LOOSE, SMOKY, QUIET, un preset tuo, oppure CUSTOMUn'ETICHETTA per le quattro manopole sotto. I valori viaggiano; il nome si legge.
preset.energy0–1Quanto forte suona il kit.
preset.swing0–1La griglia, 0 dritto … 1 terzinato pieno. Assente = lo swing del feel.
preset.humanize0–1Quanto oscilla una mano intorno alla parte.
preset.live0–1Quanto dettaglio scritto (i ghost, la variante della battuta 4) viene rivelato.

jam — le impostazioni della band:

CampoValoriSignificato
intensity0–1Quanto suona densa la band.
colorLayertrue / falseIl quarto strumento (colore) della band.
rhythmGuitartrue / falseLa chitarra ritmica della band, dove lo stile ne ha una.

La regola di risoluzione

Ogni campo di corsia si risolve in un ordine, per campo:

SEZIONE → LA SEZIONE PRIMA → BRANO
  • Una sezione che imposta un campo lo decide. Una sezione che imposta solo fill.in decide il piatto e per tutto il resto segue.
  • Una sezione che lascia un campo aperto suona quello che suonava la sezione prima: dici HALF TIME una volta sola e resta finché qualcosa non dice altro. Nell'editor questo si legge FOLLOW PREV.
  • La prima sezione non ha niente prima di sé, quindi prende le corsie del brano (FOLLOW SONG).
  • Lo stile, il kit e il genere sono del brano su ogni sezione. Niente che una sezione possa dire.
  • Il nome del preset segue solo quando ogni manopola segue. Una sezione che ha spostato una manopola sotto un preset con nome si legge CUSTOM: il nome è un'etichetta per esattamente quei quattro valori. Una sezione che nomina un preset e non imposta nessuna manopola porta il nome E le manopole della sezione prima: l'editor scrive sempre un nome con i suoi valori.
  • Chi ascolta non è nella lista. Un campo che il brano lascia aperto viene completato con un valore fisso, parte del formato, così lo stesso documento suona la stessa band ovunque:
CampoValore predefinito
stylerock
kitil primo kit dello stile
drums.offfalse
drums.feelil primo feel dello stile
drums.fill.inassente: decide l'arrangiamento
drums.fill.outauto
drums.variation[]
drums.presetSTOCK: energy 0.5, lo swing del feel, humanize 0.15, live 0.25
jam.intensity0.5
jam.colorLayerfalse
jam.rhythmGuitarse lo stile ha quello strumento

Lo swing e il live di una sezione finiscono sull'orologio dell'app (GRID) mentre il brano suona, e non vengono mai salvati come tuoi: i tuoi tornano quando lasci il brano.

L'oggetto chart

{
  "writtenKey": { "tonic": 9, "mode": "minor" },
  "endBehavior": "end",
  "sections": [
    {
      "id": "…",
      "name": "INTRO",
      "repeats": 2,
      "energy": "sparse",
      "color": "cyan",
      "drums": { "feel": "straight", "fill": { "in": "none" } },
      "items": [
        { "ref": { "degree": { "_0": { "degree": 1, "alteration": 0, "quality": { "minor": {} }, "alterations": [], "secondaryOf": false } } },
          "duration": { "bars": 2, "ticks": 0 }, "rawText": "Am" },
        { "ref": { "absolute": { "_0": { "root": { "letter": "F", "accidental": 0 }, "type": { "major": {} }, "alterations": [] } } },
          "duration": { "bars": 1, "ticks": 0 }, "rawText": "F" }
      ]
    }
  ]
}
CampoSignificato
writtenKeyLa tonalità in cui lo schema è stato scritto, o assente. Per la visualizzazione le caselle a gradi si risolvono su quella tonalità; mentre suonano seguono il modulo TONALITÀ.
endBehavior"end" = suona una volta, poi un ultimo colpo sull'uno tenuto per una battuta e la band si ferma. Assente = loop senza fine. Stringa opaca, così un comportamento futuro non rompe mai i lettori più vecchi.
sections[]L'editor ne aggiunge fino a 24; un file viene letto per intero. Ognuna ha id, name, repeats (1-16), energy (base, lift, groove, hold, riff, sparse, stop; un valore sconosciuto suona come base), il facoltativo color, e le due corsie facoltative drums e jam (sopra). Una sezione non porta né stile, né kit, né genere di batteria, e nessun endFill: un fill in uscita è drums.fill.out: "fill". Un campo di corsia lasciato fuori significa sempre: quello che suonava la sezione prima, e per la prima sezione la corsia del brano. Mai l'impostazione di chi ascolta.
items[]Al massimo 32 per sezione. Ognuno è { ref, duration, rawText }, più un facoltativo shape. (più un push facoltativo)
refEsattamente uno tra degree, absolute, noChord, repeatPrevious. Swift codifica il contenuto sotto _0. Un grado ha degree 1-7, alteration (−1/0/+1), un facoltativo quality (tipo di accordo), alterations (b5 #5 b9 #9 #11 b13 add6 add9 add11 no3 no5) e secondaryOf (true = V/x). Un accordo assoluto ha root (letter A–G + accidental), type, alterations e un facoltativo bass. Un degree può anche portare bassIntervalSemitones (1–11): un basso con barra in semitoni sopra la fondamentale dell'accordo, così trasporta con la tonalità; { "degree": 1, "bassIntervalSemitones": 4 } è C/E in C e A/C♯ in A. Su una nota dell'accordo è un rivolto; fuori, un pedale. Dalla 0.71 la band suona il basso; prima era solo mostrato.
duration{ bars, ticks }. Le battute sono relative alla metrica (un accordo di 2 battute dura 2 battute in 4/4 come in 3/4), i tick sono il tempo esatto sotto la battuta a 24 tick per movimento, quindi { "bars": 0, "ticks": 48 } sono due movimenti. Le battute sono limitate a 0-32. L'editor scrive qualsiasi numero di movimenti (un cambio sul quarto movimento è { "bars": 0, "ticks": 72 } poi { "bars": 0, "ticks": 24 }), e una sezione non deve per forza arrivare a battute intere.
rawTextQuello che hai scritto tu, o quello che la casella mostrava quando è stata scritta. Solo per la visualizzazione: uno schema può mostrare I dove l'accordo che suona è Em.
shapeLa forma scelta sulla chitarra, come tag che si spiega da solo: sei tasti dalla corda più grave alla più acuta, x per una corda stoppata, ad esempio x32010. I tasti da 10 in su hanno bisogno di separatori (8-10-10-9-8-8), e @n dichiara un tasto di partenza che non si può dedurre dalle note (x24442@2). I tasti vanno da 0 a 24. Assente significa che l'app disegna la sua forma predefinita. Le pause e le ripetizioni non ne portano mai una. Una forma è una scelta libera, non una proprietà dell'accordo: si può scegliere un voicing di Em7 su una casella Em. Quindi nulla la controlla contro l'accordo, e un tag illeggibile vuol dire soltanto “nessuna forma”, non un brano non valido.
push"eighth" o "sixteenth" quando l'accordo è anticipato (dalla 0.71): la band lo attacca di tanto prima del suo posto scritto e lo tiene oltre il movimento. Posto e durata non si muovono mai; il conteggio delle battute, la testina e il riavvolgimento non sanno nulla dell'anticipo. Assente = sul movimento; un valore sconosciuto si legge come assente; "none" non viene mai scritto. Nel testo del brano l'anticipo è un accento circonflesso: ^G, ^^G.

I tipi di accordo sono i 24 nomi del ChordType dell'app: major minor diminished augmented sus2 sus4 major7 minor7 dominant7 diminished7 halfDiminished7 minorMajor7 augmented7 add9 major9 minor9 dominant9 major11 minor11 dominant11 major13 minor13 dominant13 power. Nel file un nome del genere è la chiave di un oggetto vuoto, { "minor7": {} }, sotto type come sotto quality.

Cosa accetta l'app all'import

importSongs prova tre forme in ordine e prende la prima che si decodifica:

  1. un documento .noisesong { "version": …, "song": { … } },
  2. un oggetto song da solo, senza busta,
  3. un'esportazione dell'intera libreria { "version": …, "songs": [ … ] }: viene importato ogni brano che questa versione sa leggere; quelli illeggibili vengono saltati, mai il file intero.

In ogni forma un brano con schemaVersion sotto 3 viene saltato: l'app registra il motivo nel log, e niente viene convertito.

Il pulsante Apri in NØISE del sito, e il pulsante Copia il link accanto, producono questo link. L'app da sola non fa link: li legge soltanto.

noise://song?d=<payload>
  • schema noise, host song, un solo parametro di query d;
  • <payload> è il documento .noisesong codificato in forma compatta (senza spazi, chiavi in ordine, version: 3, schemaVersion: 3) come base64url (RFC 4648 §5, - e _ al posto di + e /, senza padding =).

Quando l'app apre un link così, decodifica il payload con le stesse regole di un file. È tollerante: decodifica anche un payload che arriva con il padding o percent-encoded. Siccome il JSON non è compresso, un link è circa 1,4 volte il JSON compatto: un brano di quattro sezioni sono pochi kilobyte. Un link più lungo di quello che accetta la tua chat va condiviso come file.

Aprire un link non aggiunge mai niente in silenzio: l'app chiede prima. Vedi Importa.

Dove sta la tua libreria

Tutti i brani stanno in un solo file, dentro il container dell'app:

~/Library/Containers/com.noise-app.macos/Data/Library/Application Support/NØISE/jam-songs.json

Viene scritto in modo atomico; a ogni salvataggio riuscito la versione precedente resta come jam-songs.json.bak, e un file principale corrotto viene ripristinato in silenzio dal backup (la copia corrotta resta come jam-songs.json.corrupt). La libreria tiene al massimo 100 brani; oltre, al salvataggio vengono scartati i brani aggiornati da più tempo. Una libreria scritta prima dello schema 3 viene messa da parte come jam-songs.v2.json al primo avvio della 0.81 e la libreria riparte vuota: i brani non vengono convertiti, si scrivono di nuovo nell'editor.

Attenzione

Non modificare jam-songs.json mentre NØISE è aperto: l'app scrive il file intero a ogni salvataggio e sovrascrive le tue modifiche. Esporta un .noisesong, modifica quello e reimportalo.