$ chuck 1. Simple Sine Wave.ck
Chuck a une collection d'unitGenerators qui font du bruit. Le premier UnitGenerator que nous explorerons s'appelle SINOSC. Il s'agit d'une simple onde sinusoïdale qui émet une seule fréquence fondamentale à 440 Hertz à moitié volume. Le SINOSC est «jeté» à l'objet DAC à l'aide de l'opérateur =>. L'objet DAC ou le convertisseur audio numérique est la connexion de l'ordinateur à vos haut-parleurs externes ou carte son. Considérez l'opérateur => comme un câble de correctif ou un bouchon qui connecte la sortie audio de l'ewave sinueux dans le haut-parleur.
SinOsc s => dac;
s.gain(0.5);
s.freq(440);
Ce code seul ne produira pas de son. Pour produire du son, nous devons dire au programme combien de temps le son va durer. Chuck applique des unités de temps à l'objet maintenant. Représente maintenant l'heure actuelle plus le temps supplémentaire «chuté» jusqu'à présent. Dans cet exemple, nous voulons seulement traiter le son pendant une seconde. Par conséquent, nous «jetons» 1 seconde à maintenant.
1::second => now;
L'exécution du programme complet génère un ton lisse à 440 Hz, un demi-volume, pendant 1 seconde. Essayez de jouer avec les paramètres. Changez le ton, le volume ou le timing pour créer de nouvelles variations du son. Consultez la documentation Chuck et modifiez l'onde sinusoïdale en une vague de dents de scie ou une onde carrée. En quoi ces sons sont-ils différents?
Faisons de la musique maintenant! Pour cette leçon, nous prendrons le formulaire fondamental de base du chapitre 1 et organiserons simplement une séquence de notes pour créer une mélodie simple.
La musique, dans sa forme la plus élémentaire, est une séquence d'événements sonores joués à différents tons, durées et intervalles. Dans cet exemple, nous jouerons simplement la même durée à des intervalles de 1/4 seconde. Pour chaque événement, nous jouerons un ton simple.
La réalisation n'est pas difficile. Tout ce que nous devons faire est de copier et de coller notre code du chapitre 1 et de structurer une séquence de notes à 4 notes. À ce stade, nous pouvons modifier la fréquence de chaque événement de note et créer un modèle d'événements qui sonnent presque musicaux. Ici, nous avons simplement divisé la deuxième note en deux, multiplié la troisième note de 2, puis multiplié la note finale de 2,5.
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(440);
// Process program for a duration of 1/4 second
0.25::second => now;
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(220);
// Process program for a duration of 1/4 second
0.25::second => now;
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(880);
// Process program for a duration of 1/4 second
0.25::second => now;
// Set frequency (hertz) and volume of Sine Wave
s.gain(0.5);
s.freq(1100);
// Process program for a duration of 1/4 second
0.25::second => now;
Exécutez le programme plusieurs fois et voyez si vous pouvez modifier la séquence en une séquence que vous préférez. Pouvez-vous reproduire l'une de vos chansons préférées? Comment convertiriez-vous Hertz en notes de musique? Le séquençage de la musique comme celui-ci est-il gênant? Qu'est-ce qui faciliterait cela?
Dans le chapitre 2, nous avons réussi notre première mélodie. Ce n'était pas un petit exploit! Les ordinateurs sont très bons pour agir sur la base d'une séquence d'instructions. Compte tenu de ce que nous savons déjà, toute mélodie ou chanson peut être reproduite Note par note via Copy and Coller. Après un certain temps, créer de la musique de cette manière devient fastidieux et sans intérêt. Il doit y avoir un moyen plus facile.
Les mélodies musicales sont souvent répétées plusieurs fois sur une chanson dans ce qui est connu comme une phrase. Les phrases sont essentiellement des boucles. Des boucles de calque musicales électroniques et hip hop pour créer des textures polyrythmiques où les boucles interagissent et se jouent les unes des autres. Heureusement pour nous, il existe une structure de contrôle parfaite dans la programmation pour reproduire ce comportement - la boucle while.
Au lieu de copier et de coller chaque note, les instructions peuvent être répétées pour créer des phrases musicales. Dans Chuck, la boucle while est construite avec le mot-clé While et les supports bouclés pour contenir la séquence d'instructions qui seront répétées. Dans cet exemple, nous répéterons les instructions infiniment ou jusqu'à ce que le programme soit résilié.
// Loop Repeats while true is true (aka forever!)
while(true) {
//instructions go here
}
Habituellement, nous n'écririons pas des programmes informatiques avec des boucles infinies! C'est quelque chose qui est généralement évité dans la programmation car il accrochera le programme et empêchera le programme d'exécuter d'autres pièces ou le code et s'exécutera pour toujours. À Chuck, comme nous le découvrirons bientôt, il existe des moyens de mettre fin algorithmique et de démarrer des programmes. En musique, nous voulons peut-être improviser et laisser une boucle infinie construire un groove sur une période de temps.
Pour rendre la boucle plus intéressante, nous présenterons deux nouvelles bibliothèques - MST et Math. STD signifie Standard Library et est une collection de méthodes d'utilité utiles qui peuvent être utilisées dans nos programmes. STD dispose d'une méthode appelée «mtof» ou «midi à la fréquence». Dans la musique informatique, l'échelle de 12 notes sur le piano est représentée comme des terrains ascendants entre 0 et 127. Une octave est de 12 notes et il y a 10 octaves disponibles. Le milieu C sur le piano est représenté à 60 ans. Ne vous inquiétez pas si vous vous êtes limité à aucune connaissance musicale! L'utilisation de l'une des valeurs entre 0 et 127 nous donnera automatiquement un réglage occidental standard. Les notes MIDI sont certainement beaucoup plus faciles à travailler avec et pour les raisons.
MTOF est une méthode qui prend une entrée et renvoie une valeur. Nous entrions une valeur de note MIDI, 60 par exemple, et MTOF renverra la valeur correspondante dans Hertz. Nous pouvons observer cela en écrivant un petit programme qui imprime la sortie de STD.MTOF (60). Chuck utilise les symboles <<< >>> pour imprimer des valeurs de retour à des fins de débogage.
<<< Std.mtof(60) >>>;
261.625565 :(float)
Comme vous pouvez le voir, la composition de chansons à Hertz commence à devenir plus délicate lorsque nous essayons d'incorporer des notes de musique occidentales dans nos mélodies. Pour rendre les choses encore plus faciles, nous allons générer des notes aléatoires en utilisant la bibliothèque mathématique. Math a une fonction appelée Random2 qui prend l'entrée de 2 nombres. Les 2 nombres représentent une plage entre les premier et deuxième nombres.
Nous pouvons randomiser les octaves, des notes survenant 12 notes, en randomisant entre un ensemble de nombres et en multipliant par 12. Lorsque nous convertissons les notes en fréquence, Sinosc peut prendre la fréquence en entrée et faire un son!
Std.mtof(60 + (Math.random2(0,3) * 12)) => s.freq;
Tout en rassemblant, nous pouvons envelopper notre algorithme à l'intérieur de la boucle while. C'est l'un des avantages de travailler avec la musique avec le code. Au fur et à mesure que nous progressons vers des programmes plus complexes, nous pouvons commencer à créer de la musique qui ne peut être réalisée qu'avec la programmation informatique. Ceci est connu sous le nom de composition algorithmique.
// Sine Wave connected to audio out
SinOsc s => dac;
while(true) {
// Set midi musical note
// with randomly selected octaves
Std.mtof(60 + (Math.random2(0,3) * 12)) => s.freq;
// Play for 1/4 of a second
0.25::second => now;
}
Essayez de changer la vitesse de la séquence. Que se passe-t-il lorsque vous modifiez la note du milieu C en une autre note? Comment ça sonne 12 ou 24 notes? La chanson devient-elle plus ou moins musicale si vous modifiez la valeur multiple? L'expiration loin et appuyez sur Ctrl-C sur votre clavier lorsque vous en avez assez entendu!
À venir!
À venir!
À venir!
À venir!