Plugins en C++

Zou ik persoonlijk niet aan beginnen, omslachtige grote IDE voor grote projecten, voor zoiets overkill en alleen maar verwarrend. Plus niet voor Linux :) Geany is een goeie keuze.
 
Eigenlijk kan ik met Csound en Faust al alles wat ik op plugin gebied zou willen. En die talen spreken me ook veel meer aan dan C++ met Juce. Verder is er ook nog SynthCraft: SynthCraft by Kirsty Roland - Visual Plugin Development Software Application Dat is nog in ontwikkeling maar ziet er heel veelbelovend uit.

Ten slotte ben ik nog geïnteresseerd in de gratis en open source opties voor het maken van synths die in de browser draaien. En dat vooral omdat je zo ook echt crossplatform bruikbare applicaties kunt schrijven die nagenoeg iedereen kan uitproberen.
 
Supercolllider ,superflexiebele synthenfine en environment is gebasseerd op,smalltalk .

Snap echt niet hoe je met iets als synthcraft aankomt , dat iq gewoon audio flow , heeft niks met programmeren te maken imho.

Kan je net zo goed reaktoe core leren , dat is pas een robuste dsp dataflow environment
Ik snap soms echt niet wat je bedoeling en uiteindelijke goal is
 
Gelukkig weet ik zelf wel waar ik mee bezig ben. Een uiteindelijk doel is er niet. Ik ben inmiddels gepensioneerd en mijn huidige avonturen zijn niet meer dan een hobby. Er hoeft niets gepresteerd of verantwoord te worden. Dat sommigen mijn omzwervingen niet langer kunnen volgen is niet mijn probleem. :P
 
Haha, ProgHead, ik geef je groot gelijk, doe lekker waar je zin in hebt, je doet niets verkeerd, integendeel :) En ja de tijd vliegt....maak er het beste van :)
 
Tijd voor wat experimenten. Al doende leert men. Een stukje code:

Code:
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
  for (int i = 0; i < 25; i++){
      float x = 0;
      float result = 0;
      float delta = (2*3.14159265)/25;
    x = i*delta;  
    result = sin(x);
    cout << "Output = " << result << endl;
    }

  return 0;
}

En dat levert dit op:

Code:
Output = 0
Output = 0.24869
Output = 0.481754
Output = 0.684547
Output = 0.844328
Output = 0.951057
Output = 0.998027
Output = 0.982287
Output = 0.904827
Output = 0.770513
Output = 0.587785
Output = 0.368124
Output = 0.125333
Output = -0.125333
Output = -0.368125
Output = -0.587785
Output = -0.770513
Output = -0.904827
Output = -0.982287
Output = -0.998027
Output = -0.951056
Output = -0.844328
Output = -0.684547
Output = -0.481753
Output = -0.248689


------------------
(program exited with code: 0)
Press return to continue
 
Even wat opbouwende kritiek.

Waarom
float delta = (2*3.14159265)/25;
in de for loop?
Dat is iedere keer hetzelfde. Kan je dus voor de for loop zetten waardoor je die berekening 24x uitspaart.
Dan kan je hem ook constexpr maken waardoor de compiler die kan optimaliseren.

Je zou het hele stukje ook kunnen herschrijven als:
C++:
#include <iostream>
#include <cmath>

int main() {
    constexpr double pi = 3.14159265358979323846;
    constexpr int n_samples = 25;
    constexpr double delta = (2.0 * pi)/n_samples;

    for (int i = 0; i < n_samples; i++){
        double result = std::sin(i*delta);
        std::cout <<  "Output = " << result << std::endl;
    }
    return 0;
}
Vast waarden als pi, kan je best zo definiëren. Maakt het later duidelijk dat het een constante is. En moet je dan slechts op 1 plaats updaten, bovenaan je code.
Om die reden zou ik persoonlijk PI ook helemaal bovenaan het bestand definiëren tussen de includes en main in met:
Code:
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
Met C++20 kan je trouwens ook std::numbers::pi gebruiken uit <numbers>. Dat is het beste.

Ik neem aan de i < 25 en de /25 dit getal hebben om dezelfde reden. Aantal samples?
Zeker niet 2x hetzelfde 'magische' getal gebruiken, maar definiëren als een constexpr.

namespace std zorgt later waarschijnlijk voor botsingen met namen. Beter om dit weg te laten.

Double zorgt voor meer precisie, 15 ipv 7 decimalen. Dat is keuze natuurlijk.
 
Voor pi zou ik het niet helemaal uitschrijven, maar iets als pi = 4 * atan(1), of nog korter, pi = acos(-1) gebruiken.
 
Hier staan meerdere manieren: C++ & π

Met C++20 kan je trouwens ook std::numbers::pi gebruiken uit <numbers>. Dat is het beste.

Maar dat is me niet gelukt. Ik weet ook niet welke C++ er op mijn Linux computer staat...
 
Verbeterde versie:

NGINX:
#include <iostream>
#include <cmath>

#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

constexpr int n_samples = 25;
constexpr double delta = (2.0 * M_PI)/n_samples;


int main() {
            for (int i = 0; i < n_samples; i++){
            double result = std::sin(i*delta);
            //std::cout <<  "Output = " << result << std::endl;
                  for (int i = 0; i < 20*result + n_samples; i++){
                  std::cout <<  '*';
                   }  
                  std::cout << std::endl;
             }
return 0;
}

Output:

Code:
*************************
******************************
***********************************
***************************************
******************************************
*********************************************
*********************************************
*********************************************
********************************************
*****************************************
*************************************
*********************************
****************************
***********************
******************
**************
**********
*******
******
******
******
*********
************
****************
*********************


------------------
(program exited with code: 0)
Press return to continue
 
Hoe regel ik nu de sampletijd tussen de opeenvolgende tijdstippen waarop de output wordt weggeschreven?
 
Dit op internet gevonden:

Code:
#include <iostream>
#include <chrono>
#include <thread>
using namespace std;

// Driver cpde
int main()
{
  cout << "Thread is running\n";
 
  // Thread delayed for 5 seconds
  this_thread::sleep_for(chrono::milliseconds(5000));

  cout << "Thread was acquired for 5 seconds\n";

  return 0;
}

Bron: Sleep Function in C++ - GeeksforGeeks
 
Hiermee bouwt de golf met een instelbare sampletijd op:

Code:
#include <iostream>
#include <cmath>
#include <chrono>
#include <thread>


#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

constexpr int n_samples = 25;
constexpr int st = 1000; 
constexpr double delta = (2.0 * M_PI)/n_samples;



int main() {
            for (int i = 0; i < n_samples; i++){
            double result = std::sin(i*delta);
            //std::cout <<  "Output = " << result << std::endl;
                  for (int i = 0; i < 20*result + n_samples; i++){
                  std::cout <<  '*';
                   } 
                  std::cout << std::endl;
                  std::this_thread::sleep_for(std::chrono::milliseconds(st));
             }
return 0;
}
 
@ProgHead Ik heb het wel eens eerder genoemd hier op het forum.
Als je specifiek met audio synthese en C++ aan de slag wil, dan is VCVRack aan te raden.
Het ecosysteem is voor je geregeld dus je kan je dan focussen op het maken van eigen modules.
 
Dank voor de tip. Ik zit nu inderdaad even met het probleem van de interface tussen de plugin en plugin host of tussen de standalone app en de rest van de computer. Dat wordt een vervelend "boekhoudkundig" werkje. Meestal wordt dat dan ook met behulp van Juce o.i.d. geregeld, maar Juce kreeg ik op mijn Linux computer niet goed aan de praat. En iPlug2 nog minder. Ik ben nu de andere opties aan het inventariseren. Tips zijn welkom. Het gaat mij om opties waarbij de plugin of app (deels) met C of C++ geschreven kan worden. En waarbij (bijna) iedereen die plugin of app dan kan gebruiken zonder daar speciale relatief onbekende hosts voor te hoeven installeren. Het moet niet iets worden voor slechts een klein esoterisch clubje liefhebbers. En de optie moet liefst ook nog gratis en Open Source zijn. ;-) Dit lijstje opties heb ik nu :

1. Schrijven in C of C++ voor VCV Rack
2. Schrijven in C of C++ from scratch voor LV2.
3. Schrijven in C of C++ from scratch voor CLAP.
4. Schrijven van externals in C of C++ voor PureData.
5. Schrijven van opcodes in C of C++ voor Csound.
6. Juce gebruiken op mijn Windows laptop.
 
1. Daar bestaat ook een boek over:



Heeft iemand hier dat gelezen?
 
Back
Top