(2013-12-18) [Garoa HC] AudioLazy

download (2013-12-18) [Garoa HC] AudioLazy

If you can't read please download the document

Transcript of (2013-12-18) [Garoa HC] AudioLazy

AudioLazy

Danilo de Jesus da Silva Bellini (AudioLazy Developer)

danilo.bellini [at] gmail.comTwitter: @danilobellini

https://pypi.python.org/pypi/audiolazy

AudioLazy

DSP (Digital Signal Processing) para udioAnliseMIR (Music Information Retrieval)

Sntese

Processamento

Expressividade de cdigoPrototipao, simulao

Tempo realUso em aplicaes finais

Python 2 e 3c/ o mesmo cdigo!

Documentao (Sphinx)http://pythonhosted.org/audiolazy

Testes e cobertura de cdigo

--------------- coverage: platform linux2, python 2.7.3-final-0 ----------------Name Stmts Miss Branch BrPart Cover Missing------------------------------------------------------------__init__ 44 1 18 4 92% 72lazy_analysis 125 3 60 2 97% 211, 259-260lazy_auditory 60 0 14 0 100% lazy_compat 42 5 6 1 88% 43, 67-68, 78-79lazy_core 175 7 80 9 94% 124, 136-138, 346, 471, 478lazy_filters 521 176 247 115 62% 57, 64, 85, 95, [...]lazy_io 156 43 58 28 67% 89, 141-157, 161, [...]lazy_itertools 41 7 20 11 70% 39, 60-61, 66, 108-111lazy_lpc 128 15 42 7 87% 121, 135-136, [...]lazy_math 61 1 28 0 99% 133lazy_midi 54 5 26 3 90% 70, 111, 150, 156, 158lazy_misc 110 9 62 10 89% 156-157, 194, [...]lazy_poly 191 2 126 3 98% 396-397lazy_stream 175 2 76 4 98% 59, 738lazy_synth 251 32 124 40 81% 278-300, 467, 469, [...]lazy_text 102 33 70 29 64% 132-147, 205-229, [...]------------------------------------------------------------TOTAL 2236 341 1057 266 82%

========================= 2310 passed in 22.36 seconds =========================

Mock

Orculos(NumPy, SciPy)

Talk is cheap.
Show me the code.
(Linus Torvalds)

Hello world

Tocar uma senideConsole(e.g. IPython)

ScriptsGerenciadores de contexto

from audiolazy import *

rate = 44100s, Hz = sHz(rate)

player = AudioIO()snd = sinusoid(440 * Hz).limit(2 * s)th = player.play(snd, rate=rate) # an AudioThread

player.close() # Kill th (AudioIO arg isn't true)

with AudioIO(True) as player: # Wait threads player.play(snd, rate=rate)

Multithread!

Notas/Alturas e MIDI Pitch

Pitch (notas/alturas)C, D, E, F, G, A, B

Do, Re, Mi, Fa, Sol, La, Si

OitavasIniciam em d

Ignoram a alteraoCb4 (d bemol) a mesma nota que B3

MIDI PitchDefine 69 como A4 (l central), deslocamento em semitons

Funes para realizar conversesmidi2str

str2midi

freq2str

str2freq

midi2freq

freq2midi

Controle e tipos de sntese

ControlStreamProperty value

Permite interatividadeTempo real

SnteseAditiva (e.g. classe TableLookup)

ModulaoRing Modulation (Anel)Senide * Senide

AM (Amplitude)Senide * (1 + Senide)

FM (Frequncia ou fase)Senide(Senide)

Subtrativa (e.g. modelo de Karplus-Strong)

In [1]: data = ControlStream(42)

In [2]: data.take(5)Out[2]: [42, 42, 42, 42, 42]

In [3]: data.value = -1

In [4]: data.take(5)Out[4]: [-1, -1, -1, -1, -1]

Exemplos

HardwareArduino via PySerial

Jogos/gamesCampo minadoSntese em tempo real

https://github.com/danilobellini/mmines

MsicaRecortes e normalizao (gerao de arquivos WAV)

Composies, e.g. trilha musical de Klockwork (game)

Exemplos no repositrio!!!

keyboard.py (com tkinter)mcfm.py (com wxPython)play_bach_choral.py (com music21)save_and_memoize_synth (wave)

Container para udio

Qualquer itervel pode ser udio!

Tempo realAmostras (dados/elementos) inexistentes......em tempo de compilao (dados a serem coletados)

...em tempo de execuo (dados criados no futuro)

Suporte a endless

Causal (independe de dados futuros)

Minimizar lag (atraso) entre entrada e sada

Lazy!

Derivado da discusso durante a apresentao, as aspas indicam que o objeto no precisa conter, literalmente, os elementos, assim como o conjunto dos nmeros naturais no pode ser construdo na prtica (por conter infinitos elementos) e definido atravs de regras de gerao de nmeros, embora seja dito que ele contm seus elementos.

Classe Stream

Itervel

Heterogneo

Lazy! (Avaliao tardia)

Operadores (Elementwise/broadcast)

Mtodos (take, peek, limit, skip, map, filter, blocks)

In [1]: from audiolazy import Stream, infIn [2]: dados = Stream(5, 7, 1, 2, 5, 3, 2) # PeridicoIn [3]: dados2 = Stream(0, 1) # Idem

In [4]: (dados + dados2).take(15)Out[4]: [5, 8, 1, 3, 5, 4, 2, 6, 7, 2, 2, 6, 3, 3, 5]

In [5]: (_ * Stream(1 + 2j, -3j, 7).imag).map(int).take(inf)Out[5]: [2.0, 0.0, 14]

In [1]: data = Stream(range(7))

In [2]: blks = data.blocks(size=3, hop=2)

In [3]: [list(blk) for blk in blks]Out[3]: [[0, 1, 2], [2, 3, 4], [4, 5, 6]]

Efeito wah, knob guitarra, transies

Filtros digitais e a Transformada Z

Filtros LTI
(Lineares e invariantes no tempo)

Digital signal processing is mainly based on linear time-invariant systems.

(Dutilleux, Dempwolf, Holters e ZlzerDAFx, segunda edio, captulo 4, p. 103)

Transformada Z

Definio:

Interpretao:Atraso em k amostras!

In [1]: from audiolazy import z, inf

In [2]: sig = [1, 2, 3, 4, 5, 6, 7]

In [3]: (z ** -2)(sig).take(inf)Out[3]: [0.0, 0.0, 1, 2, 3, 4, 5]

In [4]: (1 - z ** -2)(sig).take(inf)Out[4]: [1.0, 2.0, 2, 2, 2, 2, 2]

Plot (AudioLazy + MatPlotLib)!

DTFT - Caso particular da transformada ZO valor de z est na circunferncia complexa unitria

Mtodo plot dos filtrosResposta em frequncia

Mtodo zplotEstabilidade do filtro

Plos: XRazes do denominador

Zeros: ORazes do numerador

X

X

gammatone_plots.pytambm tem resposta ao impulso

Filtros prontos!

AudioLazyMdia mvel

Ressonadores

Comb

Passa-baixas

Passa-altas

Gammatone (Patterson-Holdsworth, audio)

Scipy.signalButterworth

Chebyshev

Elptico

Filtros variantes no tempo!Coeficientes (fatores a em parcelas a * z ** -k) podem ser objetos Stream)

e.g. lptv.py

JIT!

Fibonacci

h[0] = 0

h[1] = 1

h[n] = h[n-1] + h[n-2]Entrada [0, 1, 0, 0, 0, 0, ...] aplicado a esse filtro digital

Funo impulse()

In [2]: (z ** -1 / (1 - z ** -1 - z ** -2))(impulse(zero=0, ...: one=1), zero=0).take(17)Out[2]: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]

E o exemplo pi.py?

Pitch Shepard

Exemplo no GitHub

2 dimenses:Altura (pitch height)Dimenso linear

Croma (pitch chroma)Dimenso circular

Lembra Escher

Hlice

Srie harmnica

F0, 2F0, 3F0, 4F0 100 Hz, 200 Hz, 300 Hz...

Comb!

freqs = [str2freq(note) for note in "E2 G#2 B2".split()] # Mi maiorfilt = ParallelFilter(comb.tau(freq_to_lag(freq * Hz), .1 * s) for freq in freqs)filt.plot(samples=8192, rate=rate, min_freq=220*Hz, max_freq=880*Hz).show()

Coletando a altura

ZCR (Taxa de cruzamento no zero)

DFT (Transformada Discreta de Fourier)

AMDF (Average Magnitude Difference Function)

Envoltria espectral com
LPC (Linear Predictive Coding)

Formantes

Pode ser utilizado para classificao de vogais(anlise e sntese)

e.g.lpc_plot.pyformants.py

Polinmios

Baseados em dicionrioMemria

Expoente negativo (Laurent)

Expoente fracionrio (soma de potncias)

Objeto x

InterpolaoLagrange

In [9]: lagrange.poly([(0, 0), (1, 1)])Out[9]: x

In [10]: lagrange.poly([(0, 0), (1, 1), (2, 2)])Out[10]: x

In [11]: lagrange.poly([(0, 0), (1, 1), (2, 4)])Out[11]: x^2

In [9]: lagrange.poly([(1, 3), (3, 14), (45, 0)])Out[9]: -2.89773 + 6.0303 * x - 0.132576 * x^2

In [7]: (x + x ** 2 + x ** -.5)(4)Out[7]: 20.5

Imagens feitas com a AudioLazy

possvel... ?

Em tempo real...Distoro ?

Delay ?

Flanger ?

Phaser ?

Compressor/limiter ?

Vejamos...

2013 PSI2222
Orientaes at Poli-USP

Pedaleira (4 alunos)https://github.com/RicardoBoccoliGallego/DigitalPedalBoard

PySerialHardware controlador em Arduino

2 botes + pedal expresso

AudioLazyDistoro, flanger, filtros,

wxPython

MatPlotLibGrfico da envoltria dinmica (envelope) atualizado em tempo real

2013 PSI2222
Orientaes at Poli-USP

Sintetizador (outros 4 alunos) [inacabado]https://github.com/elisatengan/Synthesis

PyGameI/O MIDI

AudioLazyModelo de Karplus-Strong modificado

LPC: Filtros de sntese/anlise

PyQt4

Apenas visual, esta GUI est inacabada

Obrigado!

Perguntas?

Fork me on GitHubhttps://github.com/danilobellini/audiolazy

2013-12-18 AudioLazy no Garoa Hacker ClubeSo Paulo SP Danilo J. S. Bellini @danilobellini