Code de goret garanti 100% pur porc:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
#
# Usage:
#
# $ python noise.py triangle 100 sawtooth 4 | aplay -f FLOAT_LE -c1
# $ python noise.py square 200 sine 0.3 | aplay -f FLOAT_LE -c1
# $ python noise.py sine 20000 sine 12 | aplay -f FLOAT_LE -c1
#
# etc...
#
import struct
import sys
from random import random
from math import sin, pi
sine = sin
def noise(_):
return random() * 2 - 1
def sawtooth(x):
return 1 - (1 / pi * x)
def square(x):
return 1.0 if x < pi else -1.0
def triangle(x):
if x < pi:
return -1 + (2 / pi) * x
else:
return 3 - (2 / pi) * x
def get_func(name):
try:
return globals()[name]
except KeyError:
print >> sys.stderr, "No function", name
sys.exit(1)
def make_noise():
sample_rate = 8000
two_pi = 2 * pi
base_func = get_func(sys.argv[1])
base_freq = float(sys.argv[2])
mod_func = get_func(sys.argv[3])
mod_freq = float(sys.argv[4])
mod_inc = two_pi / (sample_rate / mod_freq)
x = 0.0
mod_x = 0.0
while True:
sys.stdout.write(struct.pack('f', base_func(x)))
inc = (mod_func(mod_x) / 2 + 0.5) * (two_pi / (sample_rate / base_freq))
mod_x += mod_inc
x += inc
if x > two_pi:
x -= two_pi
if mod_x > two_pi:
mod_x -= two_pi
if __name__ == '__main__':
make_noise()
C'est pas un peu inspiré par http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html ?-}
Bah j'aurais appris pas mal de choses.
Dans ma jeunesse, j'avais bricolé en C
quelques trucs dans ce genre. Je dois encore avoir un tarball quelque part...
Tu pourrais nous expliquer ça dans un blog avec bouts de codes à l'appui. Le C, ça traverse les générations.
Oui voila mais comme ca fait deja plus d'une semaine que j'ai poste ce lien dans reynerie, faut des trucs frais un peu ;-)
Ok ça déterre... c'est normal je découvre à peine le mySmeuh... désolé ;-)
Mais bon, je t'ai ressorti des cartons un (très) vieux bout de C, dans les 10 ans d'age je dirais, alors ça devrait te faire plaisir : http://jules.reynerie.org/envrac/gen.c
On dirait que ce truc essaie de générer une sinusoïde sur 8 bits et à 8000 échantillons par seconde, la fréquence du sinus étant le seul argument du programme.
Les algos ça n'a jamais été mon fort :D
Je suis un peu lent à la détente, mais je suis en train de partir sur une nouvelle idée de vieux dingue : faire du traitement du son avec des langages pas fait pour.
Je commence par un mélange de shell et de Awk pour les premiers essais, mais je songe déja à la suite : embarquer un interpréteur Lua dans un wrapper spécialisé pour ce genre de processing.