View
321
Download
0
Category
Preview:
Citation preview
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
Recommended