Whistle Synth is een gratis, open source applicatie voor macOS die gebruikers in staat stelt een synthesizer aan te sturen door te fluiten. De auteur heeft AI-modellen zoals Claude ingezet om de technische implementatie volledig te herzien, wat resulteerde in een aanzienlijke verlaging van de audio-latentie (van 80ms naar 5ms) en het elimineren van audio-stotteringen.
Het artikel beschrijft het proces van het ontwikkelen van verschillende klanken, waarbij basstemmen en een Hammond-orgel voor de hoge tonen succesvol waren, terwijl andere klanken zoals fluiten en piano minder bevredigend bleken. Daarnaast is er een functie toegevoegd die een kwint lager speelt dan de fluittoon om het bereik te verbreden.
Ook het publicatieproces in de Mac App Store wordt belicht, waarbij Gemini werd gebruikt voor het ontwerpen van iconen en Claude hielp bij de administratieve stappen en documentatie. De auteur concludeert dat AI in dit project fungeerde als een waardevolle aanvulling die het project technisch beter en toegankelijker heeft gemaakt.
Whistle Synth Mac App
Mijn programma dat fluiten gebruikt om een synthesizer aan te sturen, is nu beschikbaar in de Mac App Store. Het is gratis, bevat geen advertenties en is open source.
Als je een Mac hebt en graag fluit, probeer het dan eens. Je hebt een externe microfoon en een koptelefoon nodig (bekabeld, om latentie te minimaliseren), of beide; ik raad het eerste aan.
Technische verbeteringen met AI
In dit tijdperk van 'genies' heb ik Claude de implementatie grotendeels laten herdoen. Hierdoor is de latentie lager, stottert de audio niet meer en zijn er meer stemmen om uit te kiezen. Daarnaast is het nu een officiële Mac-app.
Latentie en stabiliteit
Het verminderen van de latentie was het eenvoudigst en snelst: ik richtte de microfoon op de koptelefoon en vroeg Claude om de latentie te verlagen. Dit gaf de AI alle nodige informatie om de roundtrip-latentie te meten. Na enkele pogingen kwam Claude erachter dat de callback API en een paar andere aanpassingen nodig waren. Hierdoor werd de roundtrip-tijd van de audio (exclusief toonhoogtedetectie en synthese) teruggebracht van 80ms naar 5ms.
Het oplossen van het stotteren was een kwestie van het opsplitsen van de logica in een detector die instructies geeft aan een synthesizer. Ironisch genoeg brengt deze refactor me terug naar hoe ik het oorspronkelijk had ontworpen, voordat ik dat vijf jaar geleden overboord gooide voor een vreemd idee dat weliswaar beter klonk, maar uiteindelijk erg beperkend bleek.
Ontwikkeling van de stemmen
Met het nieuwe systeem waren stemmen veel gemakkelijker te schrijven. Hoewel Claude al het schrijfwerk deed, hebben we samen geïtereerd tot ik tevreden was.
Basstemmen
Ik liet Claude brainstormen over verschillende soorten bas en prototypes coderen. Dit omvatte onder andere een 'octaveless bass', waarbij de harmonische mix langzaam verandert naarmate je hoger gaat, om het waargenomen octaaf constant te houden.
Hoge tonen (Treble)
Het vinden van een treble-stem waar ik tevreden over was, was veel uitdagender. Dit is iets waar ik vanaf het begin aan heb gewerkt, maar ik haatte alles wat ik probeerde. Ook voor Claude was dit moeilijker: terwijl ik 70% van de gebaseerde prototypes leuk vond, is er uiteindelijk slechts één treble-stem overgebleven die de moeite waard is om te spelen: een drawbar (Hammond) orgel.
Ons gehoor is simpelweg veel kritischer bij hogere tonen. Daarnaast zijn baslijnen vaak eenvoudiger (moeilijker om te verpesten) en registreert de stemming sneller, waardoor er minder tijd is om volledig op de noot te landen voordat iemand het merkt.
Ik zou graag meer treble-stemmen toevoegen, maar het grootste obstakel is het bepalen van welke stemmen (a) oké klinken en (b) implementeerbaar zijn door Claude. Ik heb lange tijd geprobeerd om een goede fluitklank te krijgen, inclusief voorbeelden van een echte fluit, maar zelfs na veel tijd besteed aan fysieke modellering kwam er niets uit waar ik tevreden over was. Ook diverse synth-leads en een tine piano (Rhodes) mislukten.
De reden waarom het drawbar-orgel wel goed klinkt, is volgens mij grotendeels te danken aan de roterende luidspreker (Leslie), die veel leven toevoegt dat normaal gesproken zou ontbreken bij een aanhoudende noot. Met een vergelijkbare gedachte heeft Claude ook een accordeon-geluid gemaakt, wat redelijk is, maar waar ik nog niet volledig tevreden over ben.
Toonbereik en harmonie
Ik heb ook een instelling toegevoegd waarbij de app een kwint lager speelt dan waar je op fluit (D → G). Dit betekent dat je gefluit een veelvoud van de derde harmonische invult. Dit is een idee van Ugo Conti; het is verbazingwekkend hoe snel je hersenen eraan wennen om het geluid zo te besturen, mits het volume hoog genoeg staat. Dit stelt je in staat om melodieën te fluiten in toonsoorten die anders niet goed bij je bereik zouden passen.
Publicatie in de Mac App Store
Ik had nog nooit iets via de Mac App Store gedistribueerd, mede omdat het reviewproces van Apple bekend staat als erg precies. Ik besloot te kijken of Claude me door dit proces kon loodsen.
Iconen ontwerpen
Voordat ik kon beginnen, had ik een icoon nodig. Ik vroeg Gemini er een te maken en na een paar prompts kreeg ik een resultaat. Dit was als representatie van het idee niet slecht, maar wel erg druk. Daarom vroeg ik om iets veel simpelers.
Vervolgens liet ik Claude dit repliceren met code die iconen van verschillende formaten en met afnemende detailgraad maakte. Dit was erg moeilijk voor Claude en ik moest veel helpen. Het werd nooit helemaal perfect en ik moest het iets vereenvoudigen, maar ik denk dat het goed genoeg is:
- Op 128x128 verliest het beeld de golfvorm.
- Op 32x32 verdwijnen de bedieningselementen en blijft er slechts een impressie over van een felgroene fluit.
Administratieve stappen
Het krijgen van de app in de Store vereiste een betaald developer-lidmaatschap en identiteitsverificatie. Apple las mijn ID echter verkeerd en noteerde mijn achternaam als "Kaufhan". Na contact met Apple Support kon dit worden gecorrigeerd.
Claude begeleidde me bij de rest van het proces, inclusief het maken van screenshots en een demovideo.
Reflectie
Dit is een goed voorbeeld van AI als aanvulling: ik zou dit nooit hebben gedaan als ik alles zelf had moeten uitzoeken en schrijven. Samen zijn we in staat geweest om iets te maken dat veel beter klinkt dan mijn handgecodeerde synthesizer, veel veelzijdiger is en geïnstalleerd kan worden vanuit de App Store. Ik probeer het maximale te halen uit dit venster waarin AI goed genoeg is om zeer behulpzaam te zijn, maar nog niet zo geavanceerd dat er niets meer is om zelf aan toe te voegen.
Whistle Synth Mac App
Mijn programma dat fluiten gebruikt om een synthesizer aan te sturen, is nu beschikbaar in de Mac App Store. Het is gratis, bevat geen advertenties en is open source.
Als je een Mac hebt en graag fluit, probeer het dan eens. Je hebt een externe microfoon en een koptelefoon nodig (bekabeld, om latentie te minimaliseren), of beide; ik raad het eerste aan.
Technische verbeteringen met AI
In dit tijdperk van 'genies' heb ik Claude de implementatie grotendeels laten herdoen. Hierdoor is de latentie lager, stottert de audio niet meer en zijn er meer stemmen om uit te kiezen. Daarnaast is het nu een officiële Mac-app.
Latentie en stabiliteit
Het verminderen van de latentie was het eenvoudigst en snelst: ik richtte de microfoon op de koptelefoon en vroeg Claude om de latentie te verlagen. Dit gaf de AI alle nodige informatie om de roundtrip-latentie te meten. Na enkele pogingen kwam Claude erachter dat de callback API en een paar andere aanpassingen nodig waren. Hierdoor werd de roundtrip-tijd van de audio (exclusief toonhoogtedetectie en synthese) teruggebracht van 80ms naar 5ms.
Het oplossen van het stotteren was een kwestie van het opsplitsen van de logica in een detector die instructies geeft aan een synthesizer. Ironisch genoeg brengt deze refactor me terug naar hoe ik het oorspronkelijk had ontworpen, voordat ik dat vijf jaar geleden overboord gooide voor een vreemd idee dat weliswaar beter klonk, maar uiteindelijk erg beperkend bleek.
Ontwikkeling van de stemmen
Met het nieuwe systeem waren stemmen veel gemakkelijker te schrijven. Hoewel Claude al het schrijfwerk deed, hebben we samen geïtereerd tot ik tevreden was.
Basstemmen
Ik liet Claude brainstormen over verschillende soorten bas en prototypes coderen. Dit omvatte onder andere een 'octaveless bass', waarbij de harmonische mix langzaam verandert naarmate je hoger gaat, om het waargenomen octaaf constant te houden.
Hoge tonen (Treble)
Het vinden van een treble-stem waar ik tevreden over was, was veel uitdagender. Dit is iets waar ik vanaf het begin aan heb gewerkt, maar ik haatte alles wat ik probeerde. Ook voor Claude was dit moeilijker: terwijl ik 70% van de gebaseerde prototypes leuk vond, is er uiteindelijk slechts één treble-stem overgebleven die de moeite waard is om te spelen: een drawbar (Hammond) orgel.
Ons gehoor is simpelweg veel kritischer bij hogere tonen. Daarnaast zijn baslijnen vaak eenvoudiger (moeilijker om te verpesten) en registreert de stemming sneller, waardoor er minder tijd is om volledig op de noot te landen voordat iemand het merkt.
Ik zou graag meer treble-stemmen toevoegen, maar het grootste obstakel is het bepalen van welke stemmen (a) oké klinken en (b) implementeerbaar zijn door Claude. Ik heb lange tijd geprobeerd om een goede fluitklank te krijgen, inclusief voorbeelden van een echte fluit, maar zelfs na veel tijd besteed aan fysieke modellering kwam er niets uit waar ik tevreden over was. Ook diverse synth-leads en een tine piano (Rhodes) mislukten.
De reden waarom het drawbar-orgel wel goed klinkt, is volgens mij grotendeels te danken aan de roterende luidspreker (Leslie), die veel leven toevoegt dat normaal gesproken zou ontbreken bij een aanhoudende noot. Met een vergelijkbare gedachte heeft Claude ook een accordeon-geluid gemaakt, wat redelijk is, maar waar ik nog niet volledig tevreden over ben.
Toonbereik en harmonie
Ik heb ook een instelling toegevoegd waarbij de app een kwint lager speelt dan waar je op fluit (D → G). Dit betekent dat je gefluit een veelvoud van de derde harmonische invult. Dit is een idee van Ugo Conti; het is verbazingwekkend hoe snel je hersenen eraan wennen om het geluid zo te besturen, mits het volume hoog genoeg staat. Dit stelt je in staat om melodieën te fluiten in toonsoorten die anders niet goed bij je bereik zouden passen.
Publicatie in de Mac App Store
Ik had nog nooit iets via de Mac App Store gedistribueerd, mede omdat het reviewproces van Apple bekend staat als erg precies. Ik besloot te kijken of Claude me door dit proces kon loodsen.
Iconen ontwerpen
Voordat ik kon beginnen, had ik een icoon nodig. Ik vroeg Gemini er een te maken en na een paar prompts kreeg ik een resultaat. Dit was als representatie van het idee niet slecht, maar wel erg druk. Daarom vroeg ik om iets veel simpelers.
Vervolgens liet ik Claude dit repliceren met code die iconen van verschillende formaten en met afnemende detailgraad maakte. Dit was erg moeilijk voor Claude en ik moest veel helpen. Het werd nooit helemaal perfect en ik moest het iets vereenvoudigen, maar ik denk dat het goed genoeg is:
- Op 128x128 verliest het beeld de golfvorm.
- Op 32x32 verdwijnen de bedieningselementen en blijft er slechts een impressie over van een felgroene fluit.
Administratieve stappen
Het krijgen van de app in de Store vereiste een betaald developer-lidmaatschap en identiteitsverificatie. Apple las mijn ID echter verkeerd en noteerde mijn achternaam als "Kaufhan". Na contact met Apple Support kon dit worden gecorrigeerd.
Claude begeleidde me bij de rest van het proces, inclusief het maken van screenshots en een demovideo.
Reflectie
Dit is een goed voorbeeld van AI als aanvulling: ik zou dit nooit hebben gedaan als ik alles zelf had moeten uitzoeken en schrijven. Samen zijn we in staat geweest om iets te maken dat veel beter klinkt dan mijn handgecodeerde synthesizer, veel veelzijdiger is en geïnstalleerd kan worden vanuit de App Store. Ik probeer het maximale te halen uit dit venster waarin AI goed genoeg is om zeer behulpzaam te zijn, maar nog niet zo geavanceerd dat er niets meer is om zelf aan toe te voegen.