4 votes

Structure de données pour la synthèse audio par assemblage

Je suis en train d'écrire un synthé simple en assembleur comme projet d'apprentissage, et j'aimerais implémenter quelques fonctions plus avancées que l'on trouve sur les synthés modernes, à savoir l'enveloppe ADSR et la modulation de largeur d'impulsion en utilisant une onde sinusoïdale. Pour l'instant, je génère les échantillons à la main et les envoie à la sortie audio, qui possède un tampon d'échantillons et une interruption lorsqu'il est presque vide.

Ce qui me bloque, c'est la façon de générer une forme d'onde "continue". Pour l'instant, je génère des échantillons pour une seule instance d'une onde (qu'il s'agisse d'une scie ou d'une impulsion), et je boucle simplement cette onde pour générer une sortie continue. Comme vous pouvez l'imaginer, cela n'est pas très adapté à la PWM et à l'enveloppe ADSR. J'ai donc besoin de générer l'onde à la demande, avec des ajustements potentiels à la volée, comme la modulation de la largeur d'impulsion ou de la hauteur (par exemple pour le legato), mais je suis bloqué sur la façon de représenter cela efficacement en mémoire, ainsi que sur la façon de mettre en pause la génération de la forme d'onde lorsque le tampon a été rempli et de la reprendre lorsque l'interruption se produit.

Je ne cherche pas tant une solution qu'un coup de pouce dans la bonne direction de la pensée :-)

Merci !

2voto

catflier Points 5637

Générer l'onde à la demande fonctionnerait pour des ondes simples, bien que si vous souhaitez ajouter des fonctionnalités supplémentaires/dsps par la suite, vous aurez toujours besoin d'une sorte de tampon.

L'ADSR pour l'amplitude est assez simple, puisqu'il suffit de mettre à l'échelle la forme d'onde, pour la modulation de fréquence, c'est un peu plus compliqué, voici un article qui l'explique. lien

Vous pouvez également vérifier farbraush github, il devrait y avoir de belles inspirations pour vous.

1voto

elSnape Points 302

Il semble que votre façon de générer une onde soit une approche adaptée à la synthèse soustractive. Si vous voulez ajuster le PWM de votre forme d'onde, vous devrez régénérer les échantillons (ou récupérer une forme d'onde pré-calculée stockée en mémoire).

Dans la plupart des cas, vous devrez également reconstruire la table d'onde si la hauteur du son change. Vous pouvez lire l'onde à une vitesse plus rapide en calculant les incréments du pointeur de lecture par rapport à la fondamentale de l'onde, mais cela nécessite d'interpoler entre les valeurs de la table d'onde et peut introduire du crénelage avec des ondes plus complexes.

Dans la plupart des cas, bien sûr, il est peu probable que l'onde générée soit exactement 2^n échantillons. Par conséquent, au début de la routine de traitement, copiez d'abord les échantillons de l'onde précédente avant de copier l'onde actuelle dans le tampon de sortie.

Vous ne voulez pas que le processus de régénération perturbe votre routine de traitement DSP, donc je construirais la forme d'onde mise à jour dans un emplacement de mémoire séparé et la copierait quand elle est prête.

Une enveloppe ADSR (la méthode soustractive) doit être appliquée comme un coefficient de gain mobile après la génération de l'onde, plutôt que d'affecter l'onde elle-même.

J'espère que cela vous aidera :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X