Posté par al al le 8 octobre 2011

kick noise python

Un peu de bruit avec Python

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()

Commentaires sur ce billet

Merci de vous authentifier (ou vous inscrire) pour laisser un commentaire

Voir le code source en reStructuredText