Il s'agit du premier d'une série de didacticiels dans lesquels nous allons créer un moteur audio basé sur un synthétiseur pouvant générer des sons pour des jeux de style rétro. Le moteur audio générera tous les sons au moment de l'exécution sans recourir à des dépendances externes telles que des fichiers MP3 ou des fichiers WAV. Le résultat final sera une bibliothèque de travail qui pourra être insérée facilement dans vos jeux..
Avant de pouvoir créer le moteur audio, nous devons comprendre certaines choses. Cela inclut les formes d'onde que le moteur audio utilisera pour générer les sons audibles, et comment les ondes sonores sont stockées et représentées sous forme numérique..
Le langage de programmation utilisé dans ce didacticiel est ActionScript 3.0, mais les techniques et les concepts utilisés peuvent facilement être traduits dans tout autre langage de programmation fournissant une API audio de bas niveau..
Si vous souhaitez utiliser les exemples interactifs de ce didacticiel, assurez-vous que Flash Player 11.4 ou version ultérieure est installé sur votre navigateur..
Le moteur audio que nous allons créer utilisera quatre formes d’ondes de base (également appelées périodique formes d'onde, car leurs formes de base se répètent périodiquement), qui sont toutes extrêmement communes dans les synthétiseurs analogiques et numériques. Chaque forme d'onde a sa propre caractéristique audible.
Les sections suivantes fournissent un rendu visuel de chaque forme d'onde, un exemple audible de chaque forme d'onde et le code nécessaire pour générer chaque forme d'onde sous la forme d'un tableau de données exemple..
L'onde de pouls produit un son net et harmonique.
Pour générer un tableau de valeurs (comprises entre -1,0 et 1,0) représentant une onde de pouls, nous pouvons utiliser le code suivant, où n
est le nombre de valeurs requises pour remplir le tableau, une
est le tableau, et p
est la position normalisée dans la forme d'onde:
var i: int = 0; var n: int = 100; var p: nombre; alors que je < n ) p = i / n; a[i] = p < 0.5 ? 1.0 : -1.0; i ++;
L'onde en dents de scie produit un son aigu et dur.
Pour générer un tableau de valeurs (comprises entre -1,0 et 1,0) représentant une onde en dents de scie, nous pouvons utiliser le code suivant, où n
est le nombre de valeurs requises pour remplir le tableau, une
est le tableau, et p
est la position normalisée dans la forme d'onde:
var i: int = 0; var n: int = 100; var p: nombre; alors que je < n ) p = i / n; a[i] = p < 0.5 ? p * 2.0 : p * 2.0 - 2.0; i ++;
L'onde sinusoïdale produit un son lisse et pur.
Pour générer un tableau de valeurs (comprises entre -1,0 et 1,0) représentant une onde sinusoïdale, nous pouvons utiliser le code suivant, où n
est le nombre de valeurs requises pour remplir le tableau, une
est le tableau, et p
est la position normalisée dans la forme d'onde:
var i: int = 0; var n: int = 100; var p: nombre; alors que je < n ) p = i / n; a[i] = Math.sin( p * 2.0 * Math.PI ); i ++;
L'onde triangulaire produit un son lisse et harmonique.
Pour générer un tableau de valeurs (comprises entre -1,0 et 1,0) représentant une onde triangulaire, nous pouvons utiliser le code suivant, où n
est le nombre de valeurs requises pour remplir le tableau, une
est le tableau, et p
est la position normalisée dans la forme d'onde:
var i: int = 0; var n: int = 100; var p: nombre; alors que je < n ) p = i / n; a[i] = p < 0.25 ? p * 4.0 : p < 0.75 ? 2.0 - p * 4.0 : p * 4.0 - 4.0; i ++;
Voici une version développée de la ligne 6:
si p < 0.25) a[i] = p * 4.0; else if (p < 0.75) a[i] = 2.0 - (p * 4.0); else a[i] = (p * 4.0) - 4.0;
Deux propriétés importantes d’une onde sonore sont la amplitude et la fréquence de la forme d'onde: ceux-ci dictent la le volume et pas du son, respectivement. L'amplitude est simplement la valeur de crête absolue de la forme d'onde, et la fréquence est le nombre de fois que la forme d'onde est répétée par seconde, mesurée normalement en hertz (Hz)..
L'image suivante est un instantané de 200 millisecondes d'une forme d'onde en dents de scie d'une amplitude de 0,5 et d'une fréquence de 20 hertz:
Pour vous donner une idée de la relation entre la fréquence d'une forme d'onde et la hauteur du son audible, une forme d'onde avec une fréquence de 440 hertz produirait la même hauteur que la note A4 standard (centre A) d'un piano de concert moderne. Avec cette fréquence à l'esprit, nous pouvons calculer la fréquence de n'importe quelle note en utilisant le code suivant:
f = Math.pow (2, n / 12) * 440,0;
le n
La variable dans ce code est le nombre de notes de A4 (A moyen) à la note qui nous intéresse. Par exemple, pour trouver la fréquence de A5, une octave au-dessus de A4, définissez la valeur de n
à 12
parce que A5 est 12 notes au dessus de A4. Pour trouver la fréquence de E2, nous allons définir la valeur de n
à -5
parce que E2 est 5 notes en dessous de A4. On peut aussi faire l'inverse et trouver une note (relative à A4) pour une fréquence donnée:
n = Math.round (12.0 * Math.log (f / 440.0) * Math.LOG2E);
La raison pour laquelle ces calculs fonctionnent est due au fait que les fréquences des notes sont logarithmiques: multiplier une fréquence par deux déplace une note d'une octave vers le haut, tandis que la division d'une fréquence par deux déplace une note d'une octave vers le bas..
Dans le monde numérique, les ondes sonores doivent être stockées sous forme de données binaires. La méthode la plus courante consiste à prendre des instantanés périodiques (ou des échantillons) d'une onde sonore. Le nombre d'échantillons d'ondes pris pour chaque seconde de la durée d'un son est appelé le taux d'échantillonnage, de sorte qu'un son avec une fréquence d'échantillonnage de 44100 contiendra 44100 échantillons d'ondes (par canal) pour chaque seconde de la durée du son.
L'image suivante montre comment une onde sonore peut être échantillonnée:
Les taches blanches dans cette image représentent les points d'amplitude de l'onde qui sont échantillonnés et stockés dans un format numérique. Vous pouvez considérer cela comme la résolution d'une image bitmap: plus une image bitmap contient de pixels, plus elle peut contenir d'informations visuelles, et plus l'information obtenue est volumineuse (plus la compression de fichier est ignorée pour l'instant). Il en va de même pour les sons numériques: plus un fichier son contient d'échantillons d'ondes, plus l'onde sonore reconstruite sera précise..
En plus d'avoir un taux d'échantillonnage, les sons numériques ont également une débit binaire qui est mesurée en bits par seconde. Le débit détermine le nombre de bits binaires utilisés pour stocker chaque échantillon d'onde. Ceci est similaire au nombre de bits utilisés pour stocker les informations ARGB pour chaque pixel dans une image bitmap. Par exemple, un son avec une fréquence d'échantillonnage de 44100 et un débit de 705600 stockera chacun de ses échantillons d'onde sous forme de valeur 16 bits, et nous pouvons le calculer assez facilement à l'aide du code suivant:
bitsPerSample = bitRate / sampleRate;
Voici un exemple de travail utilisant les valeurs mentionnées ci-dessus:
trace (705600/44100); // "16"
Comprendre ce que sont les échantillons sonores est la chose la plus importante ici; le moteur audio que nous allons créer devra générer et manipuler des échantillons sonores bruts.
Une dernière chose dont nous devrions être conscients avant de commencer à programmer le moteur audio est modulateurs, qui sont extrêmement fréquents dans les synthétiseurs analogiques et numériques. Un modulateur est essentiellement une forme d'onde standard, mais au lieu d'être utilisé pour produire un son, il est couramment utilisé pour moduler une ou plusieurs propriétés d'une forme d'onde audible (par exemple son amplitude ou sa fréquence)..
Prendre vibrato, par exemple. Le vibrato est un changement de ton pulsant régulier. Pour produire cet effet à l'aide d'un modulateur, vous pouvez définir la forme d'onde du modulateur sur une onde sinusoïdale et la fréquence du modulateur autour de 8 hertz. Si vous associez ensuite ce modulateur à la fréquence d'une forme d'onde audible, vous obtiendrez un effet de vibrato: le modulateur augmentera et abaissera en douceur la fréquence (hauteur) de la forme d'onde audible huit fois par seconde..
Le moteur audio que nous allons créer vous permettra d’attacher des modulateurs à vos sons pour vous permettre de produire un grand nombre d’effets différents..
Dans le prochain tutoriel, nous allons créer le code principal du moteur audio et le rendre opérationnel. Suivez-nous sur Twitter, Facebook ou Google+ pour vous tenir au courant des derniers messages..