Plugins en C++

Het levert dan een "gebuild" C++ progje op dat je vanuit de terminal kunt runnen. Voor de "gewone gebruiker" dus ongeschikt. Maar het gaat mij nu alleen om het real-time kunnen afspelen van mijn C++ brouwsels. Als dat wat leuks oplevert kan ik dat later in Faust of Csound als standalone app wel nabouwen.
 
Programmeren voor audio is ook helemaal vanuit C++ (of C) te doen. En dat is een veel fundamentelere oplossing voor mijn probleem, want andere opties zoals plugins voor VCV schrijven hebben zoals bleek weer hun eigen problemen waar ik dan weer in verdwaal. Ziehier wat voor soort C++ code ik voor audio op mijn Linux computer nodig heb :


De derde listing van dat artikel werkt op mijn computer als ik dat programma als "example3.cpp" in het mapje "deze" op mijn desktop stop en dan in de terminal dit gebruik:

Code:
~/Desktop/deze$ g++ example3.cpp -lasound
~/Desktop/deze$ ./a.out < /dev/urandom
 
Even een zijdelingse gedachte: Arduino draait een vorm van c++ toch? Je algoritme in arduino draaien, paar potmeters aan analoge inputs hangen en inlezen als variabele, algoritme output naar een arduino output schieten en je hebt een standalone hardware synth. Midi input ook redelijk makkelijk op te brouwen.

Nu nog een lekker algoritme vinden hiervoor dat boeiend klinkt in een ruime band van parameterwaarden.
 
Ligt eraan hoever ik met C++ geraak, maar als ik de output voor de audio ook voor elkaar krijg dan smaakt dat inderdaad naar meer. Een standalone hardware synth naar eigen ontwerp op een Arduino zou dan een leuke bekroning zijn voor alle moeite. Bovendien houd ik alles open source, dus wie dat wil kan dan zelf ook zoiets maken.
 
Even een zijdelingse gedachte: Arduino draait een vorm van c++ toch? Je algoritme in arduino draaien, paar potmeters aan analoge inputs hangen en inlezen als variabele, algoritme output naar een arduino output schieten en je hebt een standalone hardware synth. Midi input ook redelijk makkelijk op te brouwen.

Nu nog een lekker algoritme vinden hiervoor dat boeiend klinkt in een ruime band van parameterwaarden.

Ik neem aan dat dit al eerder is gedaan. Je hoeft het wiel dan waarschijnlijk niet helemaal opnieuw uitvinden, de code van alles eromheen hergebruiken uit een al bestaand project, en je eigen algoritme erin schrijven. Want dat laatste is natuurlijk het meest interessant, de rest is bijzaak.
 
Zoiets?

Genoeg dingen waarmee je iets kan ontwikkelen. Dan op zoek naar een bestaand project dat lijkt op wat je wil doen, met je eigen methode/algoritme erin en wat verdere aanpassingen naar smaak. Een methode voor synthese die ik zelf 'ns zou willen proberen heb ik wel, heb alleen niet veel zin om een bult te programmeren. Maar als de basis qua code al bestaat en je dit gemakkelijk kan veranderen voor je eigen doel, moet ik hier toch 'ns naar kijken.
 
Ik denk dat het niet gaat lukken zonder ook maar iets te programmeren, wat ik in gedachten heb. Iets programmeren mag ook wel, maar dan wel dat je vooral werkt aan het schrijven van code voor de synthese-methode/algoritme zelf, en je zo min mogelijk hoeft bezig te houden met randzaken. Randzaken die waarschijnlijk al eerder zijn opgelost in code, die code zou ik dan graag willen hergebruiken.
 
De zoektocht gaat door. Net ontdekt dat ik onder Linux direct vanaf de terminal een file output.txt met een lijst getallen als geluid kan afspelen via:

Code:
sox -t raw -r 8000 -b 16 -e signed-integer output.txt -d

Waarom gaat dat dan niet met C++ zonder bladzijdenlange boilerplate code?
 
Van system() in C/C++ - GeeksforGeeks :

Code:
// C++ Program to illustrate the system function
#include <cstdlib>
#include <iostream>
using namespace std;

int main()
{
    // giving system command and storing return value
    int returnCode = system("echo Hello, World!");

    // checking if the command was executed successfully
    if (returnCode == 0) {
        cout << "Command executed successfully." << endl;
    }
    else {
        cout << "Command execution failed or returned "
                "non-zero: "
             << returnCode << endl;
    }

    return 0;
}
 
Gelukt!

Code:
#include <cstdlib>
#include <iostream>

int main()
{
    std::string out = "sox -t raw -r 2000 -b 16 -e signed-integer out.txt -d";
    system(out.c_str());
   
    return 0;
}

Nu nog integreren in mijn progje.
 
Ik moet niet te veel hooi tegelijk op mijn vorkje nemen. ;) Eerst maar eens zorgen dat het op mijn Linux computer werkt, en dan kijk ik weer verder. Ik heb nog een eenvoudig Windows laptopje om daarop te testen voor later.
 
Code:
#include <cstdlib>
#include <iostream>

int main()
{
    std::string out = "sox -t raw -r 2000 -b 16 -e signed-integer out.txt -d";
    system(out.c_str());
 
    return 0;
}

Ja dat is natuurlijk geen audio applicatie maken in C++ he? Sorry voor de tongue-in-cheek maar ik kon het niet laten: Ik heb zojuist een DAW geschreven in C++:

Code:
#include <cstdlib>
#include <string>

int main()
{
    std::string out = "/Applications/Bitwig\\ Studio.app/Contents/MacOS/BitwigStudio";
    return system(out.c_str());
}

Doet op het eerste gezicht een beetje denken aan Bitwig....
 
Laatst gewijzigd:
Een noot op een mellotron duurt maximaal 8 seconden. Om het eenvoudig te houden ga ik er voor mijn progje eveneens vanuit dat de daarmee gespeelde geluiden maximaal 8 seconden duren. Hoe ik een gegenereerd signaal in een txt bestand krijg dat weet ik al. En via het geitenpaadje van de SoX app kan ik dat txt bestand dan afspelen. De snelheid waarmee dat afspelen gebeurt bepaalt dan de ervaren toonhoogte. Het zou dus mogelijk moeten zijn om langs die weg met mijn progje een monofoon software keyboardje te maken. Maar hoe dat precies werkt, dat moet ik nog uitvogelen...

Als @3ddie weet hoe ik het audio-signaal vanuit mijn progje in C++ zonder bladzijden aan boilerplate ongein naar de audio output van mijn Linux computer kan dirigeren dan lees ik dat graag...
 
Als @3ddie weet hoe ik het audio-signaal vanuit mijn progje in C++ zonder bladzijden aan boilerplate ongein naar de audio output van mijn Linux computer kan dirigeren dan lees ik dat graag...
Ik gebruik graag miniaudio, een header only library. Kost wel wat tijd om te compileren en (vanwege header-only) voel je die pijn bij iedere compilatie maar je krijgt wel makkelijk toegang tot audio.

Hier een voorbeeld programma. Het ./c script is om de boel te compileren. Het geeft je een "play" commando. In mijn geval leest het 'raw samples' van een file maar je kunt het ook in het programma zelf genereren en dan voeden aan miniaudio. Je hoeft dus niet perse via een file te gaan.

./c geeft je ook wat usage informatie voor de play tool. Ook in de source staat wat bruikbare informatie en ik heb twee raw samples bijgesloten (16 bit 48kHz mono en stereo).
git clone git@github.com:StrangeDelight/MiniaudioSample.git

Vroegah kon je in linux gewoon direct naar het audio device catten. Dus in je programma kon je gewoon /dev/dsp openen en daar rauwe bytestreams heen sturen... aber das war einmal.
 
Laatst gewijzigd:
Is het de bedoeling dat ik je link in de command line clone?
Ja je moet de hele regel (zonder de quotes die ik er nu voor en achter zet) copy/pasten in een terminal window op je Linux bak. Indien nodig moet je nog git installeren.


Code:
"git clone git@github.com:StrangeDelight/MiniaudioSample.git"
 
Lukt niet:

Code:
git clone git@github.com:StrangeDelight/MiniaudioSample.git
Cloning into 'MiniaudioSample'...
The authenticity of host 'github.com (140.82.121.4)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
 
Back
Top