Juste une idée que j'ai eue l'autre jour: créer des rythmes en suivant une chaîne de Markov de sons prédéfinis.
Je me souviens que quelqu'un a fait une beatbox avec Google Translate et la langue allemande (suivez le lien et appuyez sur écouter).
Le défi consiste donc à créer une entrée de texte pour Google Translate à partir d'une chaîne donnée. Ou vous pouvez utiliser des notes de musique et jouer vous-même :).
Vous pouvez faire un programme lisant une ligne avec le nombre de battements, un autre avec leurs noms et une représentation matricielle des probabilités (vous pouvez choisir la représentation).
Vous pouvez également créer une fonction avec ces trois arguments.
Par exemple
[contribution]
20
pv zk bschk kkkk
[[.1, .4, .5, 0.],
[.3, .2, .3, .2],
[0., .3, .2, .5],
[.1, .8, .1, 0.]]
[sortie] quelque chose comme:
pv zk bschk zk pv bschk zk pv zk bschk kkkk pv bschk zk bschk bschk bschk zk kkkk bschk
La probabilité de départ est la même pour chaque battement.
Ce n'est pas un défi de code-golf parce que j'aimerais voir de belles solutions (soyez créatif).
Des points supplémentaires si vous inventez de nouveaux rythmes et / ou choisissez une table de probabilités qui donne de beaux rythmes la plupart du temps.
Si vous le souhaitez, vous pouvez utiliser de vrais rythmes (dans de nombreuses langues, il est facile d'ouvrir des .wav
fichiers, comme le wave
module en Python) et générer de la musique! Voici quelques extraits gratuits.
Je peux publier une implémentation de référence si nécessaire.
la source
Réponses:
J'ai fait ces morceaux:
http://soundcloud.com/belisarius/sets/golf-music
En utilisant la matrice de transition suivante:
Et le programme suivant dans Mathematica:
la source
Étant allemand, je tombais presque de ma chaise en riant de cet abus créatif de notre langue. :-)
Voici du Scala. J'encode les probabilités dans une carte qui mappe le battement à une liste de battements successifs dans lesquels les battements se produisent avec une fréquence proportionnelle à leur probabilité. Un flux de temps évalué paresseux infini est créé, dont les 10 premiers temps sont ignorés pour obtenir le caractère aléatoire approprié du premier temps de sortie. Nous renvoyons le nombre approprié de temps depuis le début de ce flux. J'utilise le paramètre de type T pour être plus court et générique.
qui peut être appelé comme ceci:
la source
J'ai écrit une fonction Javascript. Cependant, il a commencé à se battre lui-même ...
Exemple d'utilisation:
bschk(20,'pv jk bschk kkkk'.split(' '),[[.1,.4,.5,0],[.3,.2,.3,.2],[0,.3,.2,.5],[.1,.8,.1,0]])
la source
Juste une implémentation de référence en Python:
Et un programme de test:
Et quelques sorties:
Mais aucun d'eux ne fait une très bonne beatbox car il y en a trop
kkkk
:).la source