Nummers & delen
Het .noisesong-bestand en de noise://-link
Wat een .noisesong-bestand bevat, hoe de noise://-link het codeert, en de grenzen die voor allebei gelden.
Een nummer verlaat NØISE in een van twee machineleesbare vormen: een .noisesong-bestand (JSON) of een noise://-link (dezelfde JSON, verpakt in een URL). Geen van beide bevat audio. Allebei bevatten precies één nummer.
Waarschuwing
Schema 3, sinds NØISE 0.81 — zonder achterwaartse compatibiliteit. Een nummer is ÉÉN band met ÉÉN kit, en een sectie stelt zijn DRUMS- en JAM-blokken in. De app leest niets ouder dan schema 3: een bestand met schemaVersion 2 of zonder die sleutel opent als niets, en een oudere bibliotheek wordt bij de eerste start opzijgezet. Deze site weigert zo'n bestand bij upload met dezelfde woorden. Open het nummer in de editor van de app en exporteer het opnieuw.
Het .noisesong-bestand
EXPORT, in de NUMMERS-plaat en in de editor, schrijft een UTF-8 JSON-document. De app registreert het bestandstype als nl.weap.noise.song ("NØISE Song", conformeert aan public.json, extensie .noisesong), dus een dubbelklik op het bestand opent het in NØISE.
De envelop
{
"version": 3,
"song": { … }
}| Veld | Type | Betekenis |
|---|---|---|
version | integer | Versie van het bestandsformaat; 3 sinds 0.81. |
song | object | Het nummer. |
Sleutels staan gesorteerd, met inspringing. Datums zijn ISO-8601 in UTC zonder decimalen in de seconden (2026-05-01T12:00:00Z): de app weigert seconden met decimalen.
Het song-object
{
"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": { … }
}| Veld | Type | Verplicht | Betekenis |
|---|---|---|---|
id | UUID-string | ja | De identiteit van het nummer. Importeer je een nummer waarvan het id al in je bibliotheek staat, dan wordt er nooit samengevoegd: de import krijgt een nieuwe UUID en wordt een apart nummer, met het oorspronkelijke id in sourceId, zodat de afkomst bewaard blijft. |
name | string | ja | De naam van het nummer. |
chart | object | ja | Het akkoordenschema (hieronder). |
style | string | nee | De JAM-stijl van het hele nummer: pop, rock, blues, jazz, hiphop, funk, metal. Afwezig = rock. Het drumgenre volgt eruit (pop → POP, rock → ROCK, … hiphop → HIP-HOP) en is geen apart veld. Zolang het nummer speelt klinkt de eigen band van het nummer; je eigen DRUMS- en JAM-panelen komen terug zodra je het nummer loslaat. |
tempoHint | number | nee | Het tempo van het nummer; wordt op de sessie toegepast als het nummer laadt. |
songDescription | string | nee | Vrije notities (notes: in het tekstformaat). |
author | string | nee | Wie het schreef. |
kit | string | nee | Het ene JAM-kit-id van het hele nummer, binnen de stijl (pop.strings, rock.classic, metal.stock, …). Afwezig = de eerste kit van de stijl. Een kit van een andere stijl wordt genegeerd. |
drums | object | nee | Het DRUMS-blok van het nummer — het beginpunt van elke sectie. Zie De blokken. |
jam | object | nee | Het JAM-blok van het nummer — hetzelfde. |
tuning | string | nee | GuitarTuning.id: standard, dropD, halfStepDown, fullStepDown, dropC, openG, openD, dadgad. Wordt op de sessie toegepast als het nummer laadt, net als de toonsoort en het tempo: geen hint. Ontbreekt het veld, dan geldt Standard: een nummer dat geen stemming noemt is in Standard geschreven, en laden zet de sessie op Standard. |
capo | geheel getal | nee | De fret waarop de capo van het nummer zit, 0–9 (sinds 0.71). Toegepast bij het laden, net als de stemming: weggelaten of 0 betekent geen capo, en laden haalt hem eraf. Het schema blijft in de greeptoonsoort; band en detectors klinken zoveel frets hoger. |
grooveSeed | geheel getal | nee | De groove-seed van de auteur. Elke keuze die de band op de seed maakt (welke van de geschreven bas- en padmaten, de fills, de loopjes in de bas, de drumfrase, de walking bass naar het volgende akkoord) komt hieruit, zodat een gedeeld nummer op elke Mac en iPad hetzelfde speelt. Weggelaten: een vaste hash van het id van het nummer. De app schrijft er een zodra een nieuw nummer bewaard wordt en zet bij EXPORT de werkende seed erin, net als de toonsoort. Een geheel getal onder 2^53, zodat elke JSON-lezer, JavaScript ook, het exact leest. |
sourceId | UUID-string | nee | Het nummer waarvan dit nummer geïmporteerd of afgeleid is (de afkomst van gedeelde nummers). |
schemaVersion | integer | ja | 3. Alles lager, of zonder deze sleutel, wordt niet gelezen — niet door de app, niet door deze site. |
createdAt, updatedAt | date | ja | Tijdstempels. |
feel, drumStyle, drumEnergy, drumHumanize, jamIntensity, colorLayer en rhythmGuitar bestaan niet meer op het niveau van het nummer: ze zitten in drums en jam. Een nummer uit een nieuwere app faalt nooit op een extra sleutel; onbekende sleutels blijven bewaard bij een round trip.
De blokken
Dezelfde twee blokken staan op het nummer (het beginpunt van elke sectie) en op een sectie (wat ze zelf zegt). Elk veld is optioneel en betekent "hier niet ingesteld" — zie de oplosregel.
drums — wat een sectie tegen de drummer zegt:
| Veld | Waarden | Betekenis |
|---|---|---|
off | true / false | De kit is stil voor deze sectie (ruimte voor een solo). |
feel | een GrooveFeel-tag uit de lijst van de stijl (straight, halfTime, shuffle, swing, …) | De groove — één feel voor de drums ÉN de band. Een feel die de stijl niet heeft valt terug op de eerste van de stijl. |
fill.in | crash, splash, none, choke | Het bekken op de ÉÉN van de sectie. Afwezig = de opbouw beslist op basis van de overgang. choke wordt gedragen, nog niet gespeeld (klinkt als een crash). |
fill.out | auto, fill, none, break, of de naam van een fill (busy, tom roll, fill2, …) | Wat de drummer speelt op de weg uit de sectie, op de LAATSTE maat van de laatste herhaling. auto = de opbouw beslist; fill = altijd een fill, ongeacht de overgang; none = nooit; een naam = die fill uit de bank van het genre (onbekend → auto). break wordt gedragen, nog niet gespeeld (klinkt als none). |
variation | een lijst woorden | De overlays van de stijl. Wordt gedragen door het bestand; de app heeft er nog geen woorden voor. |
preset.name | STOCK, TIGHT, DRIVING, LAID BACK, LOOSE, SMOKY, QUIET, een eigen preset van de speler, of CUSTOM | Een LABEL voor de vier knoppen hieronder. De waarden reizen mee; de naam wordt afgelezen. |
preset.energy | 0–1 | Hoe hard de drummer speelt. |
preset.swing | 0–1 | Het raster, 0 straight … 1 volle triool. Afwezig = de eigen swing van de feel. |
preset.humanize | 0–1 | Hoe veel een hand om het patroon heen wankelt. |
preset.live | 0–1 | Hoeveel uitgeschreven detail (ghosts, de variant van maat 4) zichtbaar wordt. |
jam — de schakelaars van de band:
| Veld | Waarden | Betekenis |
|---|---|---|
intensity | 0–1 | Hoe druk de band speelt. |
colorLayer | true / false | De vierde (kleur)laag van de band. |
rhythmGuitar | true / false | De slaggitaarlaag van de band, waar de stijl er een heeft. |
De oplosregel
Elk veld van een blok lost op in één volgorde, per veld:
SECTION → THE SECTION BEFORE IT → SONG- Een sectie die een veld instelt beslist het. Een sectie die alleen
fill.ininstelt beslist het bekken en volgt voor de rest. - Een sectie die een veld openlaat speelt wat de sectie ervoor speelde — zet HALF TIME eenmaal en het blijft gelden tot iets anders het zegt. In de editor leest dat als VOLG VORIGE.
- De eerste sectie heeft niets ervoor, dus neemt ze de blokken van het nummer (VOLG NUMMER).
- De stijl, de kit en het genre zijn die van het nummer, op elke sectie. Niets wat een sectie kan zeggen.
- De naam van de preset volgt alleen als elke knop dat doet. Een sectie die één knop verzet onder een genoemde preset leest
CUSTOM: de naam is een label voor precies die vier waarden. Een sectie die een preset noemt en geen knop instelt draagt de naam ÉN de knoppen van de sectie ervoor — de editor schrijft een naam altijd samen met zijn waarden. - De luisteraar staat niet in de rij. Een veld dat het nummer openlaat wordt aangevuld met een vaste standaardwaarde, onderdeel van het formaat, zodat hetzelfde document overal dezelfde band speelt:
| Veld | Standaardwaarde |
|---|---|
style | rock |
kit | de eerste kit van de stijl |
drums.off | false |
drums.feel | de eerste feel van de stijl |
drums.fill.in | afwezig — de opbouw beslist |
drums.fill.out | auto |
drums.variation | [] |
drums.preset | STOCK: energy 0.5, de eigen swing van de feel, humanize 0.15, live 0.25 |
jam.intensity | 0.5 |
jam.colorLayer | false |
jam.rhythmGuitar | of de stijl de laag heeft |
De swing en live van een sectie landen op de klok van de app (GRID) terwijl het nummer speelt, en worden nooit als die van de speler bewaard; die van de speler komen terug zodra het nummer wordt losgelaten.
Het chart-object
{
"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" }
]
}
]
}| Veld | Betekenis |
|---|---|
writtenKey | De toonsoort waarin het schema geschreven is, of afwezig. Trapvakken krijgen er voor de weergave hun akkoord van; tijdens het spelen volgen ze de KEY-module. |
endBehavior | "end" = één keer spelen, dan een laatste slag op tel 1 die een maat blijft staan, en de band stopt. Afwezig = blijft in de loop. Een vrije string, zodat nieuw gedrag later oudere lezers nooit breekt. |
sections[] | De editor voegt er tot 24 toe; een bestand wordt helemaal gelezen. Elke sectie heeft id, name, repeats (1-16), energy (base, lift, groove, hold, riff, sparse, stop; een onbekende waarde speelt als base), optioneel color, en de twee optionele blokken drums en jam (hierboven). Een sectie draagt geen stijl, kit of drumgenre, en geen endFill: een fill op de weg uit is drums.fill.out: "fill". Een veld van een blok dat wordt weggelaten betekent altijd: wat de sectie ervoor speelde, en voor de eerste sectie het blok van het nummer; nooit de instelling van de luisteraar zelf. |
items[] | Hoogstens 32 per sectie. Elk item is { ref, duration, rawText }, plus optioneel een shape en een push. |
ref | Precies één van degree, absolute, noChord, repeatPrevious. Swift zet de inhoud onder _0. Een trap heeft degree 1-7, alteration (−1/0/+1), optioneel quality (akkoordtype), alterations (b5 #5 b9 #9 #11 b13 add6 add9 add11 no3 no5) en secondaryOf (true = V/x). Een absoluut akkoord heeft root (letter A-G plus accidental), type, alterations en optioneel bass (een nootnaam). Een degree kan ook een bassIntervalSemitones (1–11) dragen: een slash-bas als halve tonen boven de grondtoon van het akkoord, dus hij transponeert mee met de toonsoort; { "degree": 1, "bassIntervalSemitones": 4 } is C/E in C en A/C♯ in A. Op een akkoordtoon een omkering, erbuiten een pedaaltoon. Sinds 0.71 speelt de band de bas; daarvoor werd hij alleen getoond. |
duration | { bars, ticks }. Maten zijn relatief aan de maatsoort (een akkoord van 2 maten is 2 maten in 4/4 én in 3/4), ticks zijn exacte tijd binnen de maat, met 24 ticks per tel, dus { "bars": 0, "ticks": 48 } is twee tellen. Maten worden begrensd tot 0-32. De editor schrijft elk aantal tellen (een wissel op tel 4 is { "bars": 0, "ticks": 72 } gevolgd door { "bars": 0, "ticks": 24 }), en een sectie hoeft niet op hele maten uit te komen. |
rawText | Wat de speler typte, of wat het vak toonde toen het geschreven werd. Alleen voor de weergave: een schema kan I tonen waar Em klinkt. |
shape | De greep die de speler koos, als een tag die zichzelf uitlegt: zes frets van lage E naar hoge e, x voor gedempt, bijvoorbeeld x32010. Vanaf fret 10 zijn scheidingstekens nodig (8-10-10-9-8-8), en @n geeft een beginfret die niet uit de noten volgt (x24442@2). Frets lopen van 0 tot 24. Afwezig betekent dat de app zijn eigen standaardgreep tekent. Rusten en repeatPrevious-vakken dragen er nooit een. Een greep is een vrije keuze, geen eigenschap van het akkoord: een speler kiest een Em7-voicing op een Em-vak. Niets controleert de greep tegen het akkoord, en een onleesbare tag betekent "geen greep", niet een ongeldig nummer. |
push | "eighth" of "sixteenth" als het akkoord geanticipeerd is (sinds 0.71): de band slaat het zoveel eerder aan dan zijn geschreven plek en houdt het over de tel vast. Plek en duur veranderen nooit; maattellingen, de afspeelkop en het spoelen weten niets van een anticipatie. Weggelaten = op de tel; een onbekende waarde leest als weggelaten; "none" wordt nooit geschreven. In de nummertekst is een anticipatie een dakje: ^G, ^^G. |
Akkoordtypes zijn de 24 namen van ChordType in de 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. In het bestand staat zo'n naam als de sleutel van een leeg object, { "minor7": {} }, zowel onder type als onder quality.
Wat de app bij importeren accepteert
importSongs probeert drie vormen op volgorde en neemt de eerste die decodeert:
- een
.noisesong-document{ "version": …, "song": { … } }, - een kaal song-object,
- een export van een hele bibliotheek
{ "version": …, "songs": [ … ] }: elk nummer dat deze build kan lezen wordt geïmporteerd; onleesbare nummers worden overgeslagen, nooit het hele bestand.
In elke vorm wordt een nummer met schemaVersion lager dan 3 overgeslagen: de app logt waarom, en er wordt niets omgezet.
De noise://-link
De knop Open in NØISE op de website en Kopieer link ernaast maken deze link. De app maakt zelf geen links; die leest het alleen.
noise://song?d=<payload>- URL-schema
noise, hostsong, één queryparameterd; <payload>is het.noisesong-document, compact gecodeerd (geen witruimte, gesorteerde sleutels,version: 3,schemaVersion: 3) als base64url (RFC 4648 §5,-en_in plaats van+en/, geen=als opvulling).
Opent de app zo'n link, dan decodeert het de payload met dezelfde regels als een bestand. De decoder is tolerant: een payload die met opvulling of percent-gecodeerd binnenkomt decodeert ook. Omdat de JSON niet gecomprimeerd is, is een link ongeveer 1,4 keer zo groot als de compacte JSON: een nummer met vier secties is een paar kilobyte. Wordt een link langer dan je chatprogramma accepteert, deel dan het bestand.
Een link openen voegt nooit stilletjes iets toe: de app vraagt eerst. Zie Import.
Waar je bibliotheek staat
Alle nummers staan in één bestand, in de container van de app:
~/Library/Containers/com.noise-app.macos/Data/Library/Application Support/NØISE/jam-songs.jsonHet wordt atomair geschreven; elke keer dat bewaren lukt blijft de vorige versie staan als jam-songs.json.bak, en een corrupt hoofdbestand wordt zonder melding hersteld uit de back-up (de corrupte kopie blijft bewaard als jam-songs.json.corrupt). De bibliotheek bevat hoogstens 100 nummers; daarboven vallen bij het bewaren de nummers weg die het langst niet gewijzigd zijn. Een bibliotheek van vóór schema 3 wordt bij de eerste start van 0.81 opzijgezet als jam-songs.v2.json en de bibliotheek begint leeg — de nummers worden niet omgezet, maar opnieuw geschreven in de editor.
Waarschuwing
Bewerk jam-songs.json niet terwijl NØISE draait: de app schrijft elke keer dat je bewaart het hele bestand en overschrijft je wijzigingen. Exporteer een .noisesong, bewerk dat bestand en importeer het weer.