2017-01-20 2 views
2

Je suis encore un débutant, donc ce sera un projet assez avancé pour moi, mais je veux le démarrer maintenant et l'avoir comme une chose en cours (je n'ai pas l'intention de lancer un produit fini en 2 semaines, ni même de construire quelque chose que je vais utiliser, juste une expérience d'apprentissage). Je voulais construire un synthé à utiliser comme plugin vst3 pour ableton live 9. Je pensais que la première étape serait de faire quelque chose qui génère une forme d'onde arbitraire et répond à l'entrée midi (la fréquence change avec en ce qui concerne la note) et un modèle d'interface graphique de base. Ensuite, j'essaierai d'introduire différentes formes d'onde, suivies par plus d'oscillateurs et de désaccord, suivies de voix, suivies de filtres, suivies de plusieurs voix, etc.Que dois-je savoir pour commencer à programmer un synthé en C++/autre langue?

Comment commencer? Je connais le C++ de base, mais je ne sais pas par exemple comment créer une forme d'onde et la sortir en tant que son. C++ est-il un bon langage à utiliser pour ce type d'application?

+0

Cette question est de portée beaucoup trop large pour ce site. Il demande également l'avis (* qu'est-ce que j'ai besoin de savoir *), ce qui le rend hors sujet. Vous devrez d'abord faire vos propres recherches, puis revenir ici avec des questions précises une fois que vous l'aurez fait. Veuillez prendre quelques minutes pour compléter le [tour] et consulter les pages [aide], en particulier [Quels sujets puis-je poser à ce sujet?] (Http://stackoverflow.com/help/on-topic) et [Quels types de question devrais-je éviter de demander?] (http://stackoverflow.com/help/dont-ask). –

Répondre

5

Bien que votre question soit assez large, je peux donner un aperçu de l'endroit où commencer.

Tout d'abord, vous aurez besoin d'une copie du VST3 SDK de Steinberg

D'après mon expérience, il y a une assez grande courbe d'apprentissage pour commencer avec le SDK VST. Donc, je suggère de trouver une bibliothèque qui fournit un emballage sur le dessus. Par exemple JUCE

L'utilisation d'un wrapper vous aidera à dépasser une grande partie de la programmation standard qui doit être effectuée pour que le VST fonctionne.

En ce qui concerne la génération de formes d'ondes, le filtrage et d'autres concepts liés aux DSP ... voici tellement de choses sur le sujet que je ne pouvais même pas commencer à le décrire.

Jetez un oeil à musicdsp et The STK pour certains concepts de base.

Obtenir un livre sur le sujet. Un classique serait The Audio Programming Book

En outre, vous devez vous assurer que vous avez une bonne compréhension de la théorie audio. Jetez un oeil à Introduction to Computer Music: Volume One.

Et bien sûr, Google est votre ami.

EDIT:

Pour répondre à votre question plus complètement. Oui C++ (ou C) serait la langue de choix pour ce type d'application (mais pas le seul choix possible)

Je voudrais regarder dans l'aide d'une API Audio avant de plonger dans le développement VST, cela vous permettra de travailler sur vos compétences sans le problème du développement VST.

Comme pour les bibliothèques audio, ehese sont deux des options populaires:

  • PortAudio (écrit en C)
  • RtAudio (écrit en C++, mais pas C++ 11 ou plus)

    Ou vous pouvez jeter un oeil à libzaudio Qui est une API audio sur laquelle je travaille actuellement.(Il dépend actuellement PortAudio, mais offre un plus moderne C++ 11 le style façon de travailler avec audio)

En supposant que vous avez installé PortAudio & libzaudio ce qui suit va générer une onde sin 440Hz pour une seconde:

#include <iostream> 
#include <cmath> 
#include <libzaudio/zaudio.hpp> 

int main(int argc, char** argv) 
{ 
    try 
    { 
     //bring the needed zaudio components into scope 
     using zaudio::no_error; 
     using zaudio::sample; 
     using zaudio::sample_format; 
     using zaudio::stream_params; 
     using zaudio::time_point; 
     using zaudio::make_stream_context; 
     using zaudio::make_stream_params; 
     using zaudio::make_audio_stream; 
     using zaudio::start_stream; 
     using zaudio::stop_stream; 
     using zaudio::thread_sleep; 

     //create an alias for a 32 bit float sample 
     using sample_type = sample<sample_format::f32>; 

     //create a stream context with the default api (portaudio currently) 
     auto&& context = make_stream_context<sample_type>(); 

     //create a stream params object 
     auto&& params = make_stream_params<sample_type>(44100,512,0,2); 

     //setup to generate a sine wave 
     constexpr sample_type _2pi = M_PI * 2.0; 
     float hz = 440.0; 
     sample_type phs = 0; 
     sample_type stp = hz/params.sample_rate() * _2pi; 

     //create a zaudio::stream_callback compliant lambda that generates a sine wave 
     auto&& callback = [&](const sample_type* input, 
           sample_type* output, 
           time_point stream_time, 
           stream_params<sample_type>& params) noexcept 
     { 
      for(std::size_t i = 0; i < params.frame_count(); ++i) 
      { 
       for(std::size_t j = 0; j < params.output_frame_width(); ++j) 
       { 
        *(output++) = std::sin(phs); 
       } 
       phs += stp; 
       if(phs > _2pi) 
       { 
        phs -= _2pi; 
       } 
      } 
      return no_error; 
     }; 

     //create an audio stream using the params, context, and callback created above. Uses the default error callback 
     auto&& stream = make_audio_stream<sample_type>(params,context,callback); 

     //start the stream 
     start_stream(stream); 
     //run for 1 second 
     thread_sleep(std::chrono::seconds(1)); 
     //stop the stream 
     stop_stream(stream); 
    } 
    catch (std::exception& e) 
    { 
     std::cout<<e.what()<<std::endl; 
    } 
    return 0; 
} 

(Pulled from one of my example files)

Je serais heureux d'expliquer plus en détail si vous souhaitez me contacter ailleurs. (Une longue discussion sur le sujet ne serait pas autorisée sur Stack Overflow)