7
votes

Synthétiseur audio de forme d'onde continue

Je commence à écrire un synthétiseur doux avec une caractéristique particulière: les oscillateurs disposeront d'un bouton "de forme d'onde continue" qui permettra aux utilisateurs de sélectionner des ondes de dents sinusoïdales, carrées et scie de manière continue. C'est-à-dire que si le bouton est tout au long de la gauche, la sortie sera une onde sinusoïdale, si c'est au milieu, ce sera une vague de dents de scie, si c'est tout le chemin à droite, ce sera une vague carrée Et puis, les positions intermédiaires produiront des ondes «interpolées» des ondes classiques. - Les positions des boutons et les types d'ondes pourraient être modifiés mais ayant un moyen continu de modifier les formes d'onde sont souhaitées -

J'ai pensé à quelques façons de mettre en œuvre l'oscillateur:

  1. propose une fonction qui prend la position du bouton et calcule le spectre du signal réel (une matrice d'amplitudes et de fréquences), puis utilisez un tas de fonctions sinusoïdales et un bloc de somme pour mettre en œuvre le signal de sortie.

  2. similaire à 1. Mais appliquez une transformée de Fourier inverse au lieu des sines et de la somme (OK, à ce stade, je ne sais pas si elles sont en réalité la même chose.)

  3. génère une table de forme d'onde pour chaque position de bouton possible et utilisez une technique de synthèse de la table d'onde pour générer le signal de sortie.

  4. Commencez par 2 vagues de dents de scie (elles contiennent des harmoniques même et des harmoniques impairs), inverser une et les résumer et contrôler l'amplitude de chacun d'entre eux avec le bouton. Les formes de vagues ne seraient pas

    J'ai quelques questions:

    a. J'ai lu que la technique numéro 1 est très intense de processeur et pas vraiment réalisable. Cela tient-il vrai pour les processeurs ARM tels que celui sur l'iPad ??

    b. Quelle que soit la technique que je finis par choisir, le problème de l'aliasing peut-il être résolu simplement en connectant un filtre passe-bas à la sortie de l'oscillateur?

    c. Toute autre suggestion sur la manière de mettre en œuvre un tel oscillateur?

    d. Toute suggestion sur laquelle la boîte à outils C ++ à utiliser? Je regarde le Stk de l'ACRMMA, mais je ne sais pas s'il y a d'autres bibliothèques plus appropriées.

    me souhaite de la chance! ;)

    edit: Quelqu'un m'a pointé sur DIN hier soir. Les courbes de Bézier sont une autre option à considérer.


3 commentaires

Voulez-vous générer des échantillons de la forme d'onde ou l'appliquer à un autre signal? Envisagez-vous d'une approche "d'interpolation" spécifique?


Je souhaite utiliser cela comme un oscillateur générateur de son pour un synthétiseur. J'appliquerai ensuite le filtrage et peut-être de FX pour rendre les sons plus intéressants. Les approches que j'ai envisagées sont décrites dans 1 à 4, je ne sais pas ce que vous entendez par «approche d'interpolation».


Whoa !! Merci à tout le monde pour leurs réponses, maintenant, j'ai des devoirs de la maison :) Je vais commencer facilement au début: utilisez les oscillateurs carrés, sine et dents de scie dans le STK et tout simplement se fondue entre les trois sons pour voir ce que cela ressemble. Si j'ai encore besoin de quelque chose de plus complexe, je vais explorer les autres suggestions données. --- Je vais donner celui-ci un peu plus de temps avant de marquer une réponse acceptée ---


4 Réponses :


1
votes

La transformée de Fourier est linéaire, alors prenant la FFT d'E.G. Square et vit des vagues et traversez tous les harmons linéairement et retirez-le vers le domaine temporel, que ce soit par le férié ou en sommant des sinistres, devriez donner exactement la même sortie que simplement traverser la scie et les signaux carrés. Je ne sais pas si c'est ce que vous vouliez faire, mais s'il n'y a pas besoin de faire des FFTS ou de calculer des tables intermédiaires.

Il existe de nombreuses autres manières de "décoloration" en douceur entre les formes d'onde, vous pouvez utiliser la distorsion de la phase, par exemple, avec une courbe de distorsion constituée de segments linéaires que vous passez de positions qui génèrent une carrée pour générer une scie . Ceci est probablement très difficile à mettre en œuvre d'une manière qui est intrinsèquement bande-limitée.

aliasing peut, dans la pratique, souvent être résolue à l'aide de suréchantillonnage et de filtrage, ou simplement de filtrer. L'utilisation de techniques de bande-limitée est meilleure que l'aliasing provoquera toujours du bruit, mais vous pouvez souvent le filtrer suffisamment bas pour être inaudible, ce qui compte pour la synthèse audio.


0 commentaires

5
votes

Je ne suis pas sûr que vous ne compliquez pas cela. Si je comprends bien, tout ce que vous faites avec votre bouton de forme d'onde continue, mélangez efficacement différentes quantités de formes d'onde 3. Donc, il suffit de générer toutes les 3 formes d'onde tout le temps, puis résumez-les avec différents gains en fonction du mélange de formes d'onde que vous avez décrites.

Pour la synthèse de la forme d'onde limitée pour éviter l'aliasing, vous trouverez probablement la plupart de ce dont vous avez besoin ici .

espère que cela aide.


1 commentaires

C'est ce que j'ai fini par faire, un simple crossfader a travaillé! :)



3
votes

Voici une réponse pour B (le problème de l'aliasing peut-il être résolu simplement en connectant un filtre passe-bas à la sortie?) qui touche certains des autres points.

Malheureusement, la réponse est "non". L'aliasing est causée par la présence de fréquences harmoniques au-dessus de la fréquence nyquist (c'est-à-dire la moitié de la fréquence d'échantillonnage.) Si ces harmoniques sont présentes dans la forme d'onde de votre oscillateur, le filtrage ne peut pas aider. (Le filtrage agressif de manière appropriée détruira le caractère des vagues que vous avez générées.) La suréchantillonnation (une autre réponse mentionne cela) peut, mais c'est cher.

Pour éviter cela, vous devez générer des formes d'onde 'Band Limited'. C'est-à-dire que des formes d'onde qui n'ont aucune harmonie au-dessus de la valeur choisie ici mérite une lecture. Il existe deux approches concrètes établies pour résoudre ce problème: Blits (Train d'impulsion Limited Limited) et Minbleps. Les deux approches tentent de lisser les discontinuités génératrices d'harmoniques en insérant des «choses» à des points appropriés dans la forme d'onde.

Avec cela à l'esprit, vos options commencent à rétrécir. Probablement le meilleur compromis entre aisance et son générerait une série de wavetables de bande limitée. Vous auriez toujours besoin d'enquêter sur une forme d'anti-aliasing pour gérer les ondes interpolées, cependant.

Le bras IDEVice est tout à fait capable de faire DSP en temps réel. Conseil général: écrire un code serré, utiliser des fonctions en ligne et éviter la division. Votre boucle de rendu va être appelée 44 100 fois une seconde, tant que votre code est terminé dans les 1/44100 sec (0,023 ms), vous n'avez aucun problème. En pratique, vous devriez pouvoir exécuter plusieurs oscillateurs simultanément sans aucun problème. La présence de toutes ces applications de musique sur l'App Store témoigne de cela.

Stk est une grande bibliothèque d'introduction. (Synthèse audio en temps réel pour les applications interactives "est également une bonne mise à la terre et mérite une lecture.) STK non optimisée cependant, et je ne sais pas à quel point il se prêtait à générer vos« formes d'onde continue ». . kvraudio.com et musicdsp.org devrait être sur votre liste de lecture.


1 commentaires

Je voulais juste ajouter, qu'avec la solution 1. Un filtre passe-bas de pré-synthèse fonctionnerait bien, car vous connaissez les fréquences de tous les oscillateurs avant de les échantillonner, vous pourriez donc laisser les harmoniques dont la fréquence est supérieure au Nyquist. la fréquence.



1
votes

a. J'ai lu que la technique numéro 1 est très intense de processeur et pas vraiment réalisable. Cela tient-il vrai pour les processeurs de bras tels que celui sur l'iPad?

Cela fait un simple complexe de problèmes (jeu de mots). Accélérer.framework fournit des variations optimisées de ces fonctions (FWIW), mais il complique toujours un problème simple. En règle générale, les calculs de points flottants sur les appareils sont lents. Une implémentation de point flottant peut coûter de compromettre considérablement votre programme. Cela entraînerait probablement de compromettre les caractéristiques, la polyphonie ou la qualité de manière significative. Sans connaître le requil, il est difficile de dire si vous pouviez obtenir avec des calculs de points flottants.

b. Quelle que soit la technique que je finis par choisir, le problème de l'aliasing peut-il être résolu simplement en connectant un filtre passe-bas à la sortie de l'oscillateur?

qui ne fonctionne pas pour les signaux générés dans le domaine temporel, à moins que vous sombrez de tablier.

c. Toute autre suggestion sur la manière de mettre en œuvre un tel oscillateur?

voir ci-dessous

d. Toute suggestion sur laquelle la boîte à outils C ++ à utiliser? Je regarde le Stk de l'ACRMMA, mais je ne sais pas s'il y a d'autres bibliothèques plus appropriées.

Stk ressemble plus à un outil d'instruction qu'une boîte à outils conçue pour les synthétiseurs intégrés. Des implémentations plus appropriées existent.

Option 1. Proposez une fonction qui prend la position du bouton et calcule le spectre du signal réel (une maquette d'amplitudes et de fréquences), puis utilisez une bande de fonctions sinusoïdales et un bloc de somme pour implémenter le signal de sortie.

Option 2. Similaire à 1. Mais appliquez une transformée inverse Fourier au lieu des sines et de la somme (OK, à ce stade, je ne suis pas sûr si elles sont en réalité la même chose.)

c'est relativement lent sur les ordinateurs de bureau.

option 4. Commencez par 2 vagues de dents de scie (elles contiennent des harmoniques paires et des harmoniques impairs), inverser une et les résumer et contrôler l'amplitude de chacun d'entre eux avec le bouton. Les formes d'onde ne seraient pas

Vous pouvez le faire assez efficacement (par ex. avec un blit) pour une génération sans alias. Cependant, Blit est restreint à une poignée de formes d'onde (vous pouvez l'utiliser pour la scie et la place). Vous pouvez regarder en arrière de l'histoire et demander "Comment ont-ils résolu ce problème dans les synthés du matériel et des logiciels CA. 2000". C'était une solution. Un autre était:

Option 3. Générez une table de forme d'onde pour chaque position de bouton possible et utilisez une technique de synthèse de la table d'onde pour générer le signal de sortie.

Compte tenu des capacités du périphérique, je recommanderais une implémentation globale de ceci ou de blit.

est facile à grok et à mettre en œuvre et fournit de bons résultats de son et de la CPU. Il est également très configurable pour les compromis CPU / Memory / Quality / Quality.

Si vous voulez des alias gratuits (ou fermez-vous), optez pour Blit (ou un parent de). La raison en est que vous auriez besoin d'un bon morceau de mémoire et d'une bonne quantité de suréchantillonnage pendant au minimum, sans aliasing audible avec des wavetables.

Mise en œuvre:

Il y a de nombreuses blives (et famille ) Mises en œuvre en ligne.

Voici une serviette de serviette pour tableaux: xxx

lors de l'initialisation, utilisez la synthèse additive pour peupler OSCS .

pendant la lecture, utilisez soit:

  • Interpolation et suréchantillonnage à lire des tables
  • ou une bonne quantité de suréchantillonnage du signal puis descendant (qui est efficace de la CPU).

    pour référence: J'avais estimer l'interpolation linéaire d'une table qui a consommé une quantité irresponsable de mémoire (compte tenu du montant disponible) sans suréchantillonnage doit conserver vos fréquences d'alias ou moins -40 dB si vous étiez Pas Pour humidifier de manière audible les partiels les plus élevés et que vous avez rendu à 44,1 kHz. C'est une approche de force brute naïve! Vous pouvez faire mieux avec un peu de travail supplémentaire.

    Enfin, vous devez également trouver des informations pertinentes si vous "synthèse de vecteur" - ce que vous décrivez est une forme primitive de celui-ci.


1 commentaires

+1 C'est une réponse très illustrative, j'en ai beaucoup appris.