SlideShare uma empresa Scribd logo
1 de 34
AudioLazy
processamento de sinais para música,
jogos e muito mais!
http://pypi.python.org/pypi/audiolazy
Copyright (C) 2012-2013
Danilo de Jesus da Silva Bellini
danilo.bellini@gmail.com
@danilobellini

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
●

c/ Pyth
o m on
AudioLazy
es
2e
mo
có 3
dig
DSP (Digital Signal Processing) para áudio
o
–

Análise
●

MIR (Music Information Retrieval)

–
–
●

Síntese
Processamento

Expressividade de código
–

●

Documentação (Sphinx)

http://pythonhosted.org/audiolazy

Facilita prototipação, simulação

Tempo real (latência de aproximadamente 35ms c/ o Jack)
–

Possibilita uso em aplicações finais

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF

!
Resultados cobertura de código
Oráculos
(Testes automatizados)

(NumPy, SciPy)

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

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Parte 1
Síntese

Go go go!
Não, é Python!

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
“Hello world” em áudio
●

Tocar uma senóide
–

Console

from audiolazy import *
from audiolazy import *

(e.g. IPython)

rate = 44100
rate = 44100
s, Hz = sHz(rate)
s, Hz = sHz(rate)

Multith
rea

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

*
*
#
#

d!

s)
s)
an AudioThread
an AudioThread

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

–

Scripts podem usar gerenciadores de contexto
with AudioIO(True) as player: # Wait threads
with AudioIO(True) as player: # Wait threads
player.play(snd, rate=rate)
player.play(snd, rate=rate)

–

Dados “rate”, “s”, “Hz”, “AudioIO” e “sinusoid”:
AudioIO(True).play(sinusoid(440 * Hz).limit(2 * s), rate=rate)
AudioIO(True).play(sinusoid(440 * Hz).limit(2 * s), rate=rate)

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Notas/Alturas e MIDI Pitch
●

Notas/alturas
–

D = Ré

–

E = Mi

–

F = Fá

–

A = Lá

–

B = Si

–

–

●

MIDI Pitch
–

str2freq

–

“Cb4” (dó bemol) é a mesma nota que B3

freq2str

–

Ignoram a alteração

str2midi

–

Iniciam em dó

midi2str

–

Oitavas
–

●

Todas as combinações

G = Sol

–

●

C = Dó

–

●

midi2freq

–

freq2midi

Define 69 como A4 (lá central), deslocamento em
semitons

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
●

Controle e tipos de síntese
Ex
ControlStream
em
plo
Property “value”
s!!
wx
Permite interatividade
!
Py
Tempo real
Mu tho
Síntese
sic n,
Aditiva (e.g. classe TableLookup)
21
Modulação
–
–

●

●

–
–

●

Ring Modulation (Anel)
–

●

AM (Amplitude)
–

●

Senóide * (1 + Senóide)

FM (Frequência ou fase)
–

–

Senóide * Senóide

Senóide(Senóide)

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

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF

Imagem da
Wikipedia
Parte 2
Representação

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Container para áudio
●

Tempo real
–

Amostras (dados/elementos) inexistentes...
●
●

...em tempo de compilação (dados a serem coletados)
...em tempo de execução (dados criados no futuro)

–

Duração possivelmente indefinida (endless)

–

Não deve ser necessário computar tudo para começar a
apresentar o resultado
●
●

Resultados parciais
Para cada amostra de entrada, deve haver uma de saída
–

Minimizar lag (atraso) entre entrada e saída

Laziness!
Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Classe Stream
In [1]: data = Stream(range(7))
In [1]: data = Stream(range(7))
●

Iterável

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

●

Heterogêneo

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

●

Lazy! (Avaliação tardia)

●

Operadores (Elementwise/broadcast)

●

Métodos (take, peek, limit, skip, map, filter, blocks)
In
In
In
In
In
In

[1]:
[1]:
[2]:
[2]:
[3]:
[3]:

from audiolazy import Stream, inf
from audiolazy import Stream, inf
dados = Stream(5, 7, 1, 2, 5, 3, 2) # Periódico
dados = Stream(5, 7, 1, 2, 5, 3, 2) # Periódico
dados2 = Stream(0, 1) # Idem
dados2 = Stream(0, 1) # Idem

In [4]:
In [4]:
Out[4]:
Out[4]:

(dados
(dados
[5, 8,
[5, 8,

In [5]:
In [5]:
Out[5]:
Out[5]:

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

Centro de Convenções
Ulysses Guimarães

+ dados2).take(15)
+ dados2).take(15)
1, 3, 5, 4, 2, 6, 7, 2, 2, 6, 3, 3, 5]
1, 3, 5, 4, 2, 6, 7, 2, 2, 6, 3, 3, 5]

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Parte 3

Filtros digitais e a Transformada Z

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Filtros LTI
(Lineares e invariantes no tempo)
“Digital signal processing is mainly
based on linear time-invariant
systems.”
systems.”
(Dutilleux, Dempwolf, Holters e Zölzer
DAFx, segunda edição, capítulo 4, p. 103)
Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Transformada Z
●

Definição:

●

Interpretação:

Atraso em k
amostras!

In [1]: from audiolazy import z, inf
In [1]: from audiolazy import z, inf
In [2]: sig = [1, 2, 3, 4, 5, 6, 7]
In [2]: sig = [1, 2, 3, 4, 5, 6, 7]
In [3]:
In [3]:
Out[3]:
Out[3]:

(z **
(z **
[0.0,
[0.0,

-2)(sig).take(inf)
-2)(sig).take(inf)
0.0, 1, 2, 3, 4, 5]
0.0, 1, 2, 3, 4, 5]

In [4]:
In [4]:
Out[4]:
Out[4]:

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

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Objeto “z”
In [1]: from audiolazy import z, Stream, maverage
In [1]: from audiolazy import z, Stream, maverage
In [2]: M = 5
In [2]: M = 5
In [3]: media_movel_5 = (1 - z ** -M) / (M * (1 - z ** -1))
In [3]: media_movel_5 = (1 - z ** -M) / (M * (1 - z ** -1))
In [4]: acumulador = 1 / (1 - z ** -1)
In [4]: acumulador = 1 / (1 - z ** -1)
In [5]:
In [5]:
Out[5]:
Out[5]:

media_movel_5(Stream(5)).take(10)
media_movel_5(Stream(5)).take(10)
[1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0]
[1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0]

In [6]: acumulador(Stream(5)).take(10)
In [6]: acumulador(Stream(5)).take(10)
Out[6]: [5.0, 10.0, 15.0, 20.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0]
Out[6]: [5.0, 10.0, 15.0, 20.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0]
In [7]: maverage.recursive(4)
In [7]: maverage.recursive(4)
Out[7]:
Out[7]:
0.25 - 0.25 * z^-4
0.25 - 0.25 * z^-4
----------------------------------1 - z^-1
1 - z^-1

Filtros LTI, em geral:

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Filtros prontos!
●
●
●
●
●

JIT!

Filtr
Coe os varia
Média móvel
ntes
parc ficien
no t
tes (
elas
Ressonadores
e mp
fato
“a *
r
o
obje z ** -k” es “a” e !
Comb
tos S ) po
m
trea dem s
Passa-baixas e passa-altas
m)
er
Gammatone (Patterson-Holdsworth, audição)
–

Slaney

–

Klapuri
●

–

4 ressonadores em cascata

Implementação genérica (qualquer ordem)
●

Teoremas (parte de meu mestrado)

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Plot (AudioLazy + MatPlotLib)!
●

DTFT - Caso particular da transformada Z
–

●

Método plot dos filtros
–

●

O valor de z está na circunferência complexa unitária
Resposta em frequência

Método zplot
–

Estabilidade do filtro

–

X

Pólos: “X”
●

–

Raízes do denominador

Zeros: “O”
●

X

Raízes do numerador

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF

MatPlotLib
faz melhor
que isto...
Parte 4
Aplicações inusitadas

Cálculo numérico
Geração de imagens

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Pi!
●

Exemplo no repositório da AudioLazy

●

Série de Madhava-Gregory-Leibniz
3

5

7

9

v v v v
atan (v)=v − + − + ...
3 5 7 9

π
atan(1)=
4

●

Fórmula de Machin

π =atan 1 + atan 1
4
5
239

()

Centro de Convenções
Ulysses Guimarães

( )

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Fibonacci
●

h[0] = 0

●

h[1] = 1

●

h[n] = h[n-1] + h[n-2]
–

●

Pode-se interpretar como [0, 1, 0, 0, 0, 0, ...] aplicado
ao filtro digital com esta equação

impulse() é o iterável [1, 0, 0, 0, 0, …]

h [n]=h[n−1]+ h[ n−2]+ δ[ n−1]
In [2]:
In [2]:
Out[2]:
Out[2]:

(z ** -1 / (1 (z ** -1 / (1 [0, 1, 1, 2, 3,
[0, 1, 1, 2, 3,

Centro de Convenções
Ulysses Guimarães

z ** -1 z ** -1 5, 8, 13,
5, 8, 13,

z ** -2))(impulse()).map(int).take(16)
z ** -2))(impulse()).map(int).take(16)
21, 34, 55, 89, 144, 233, 377, 610]
21, 34, 55, 89, 144, 233, 377, 610]

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Polinômios
●

Baseados em dicionário

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

–

Memória

–

Expoente negativo (Laurent)

–

Expoente fracionário (soma de potências)

●

Objeto “x”

●

Interpolação
–

Lagrange

In [9]:
In [9]:
Out[9]:
Out[9]:

lagrange.poly([(0, 0), (1, 1)])
lagrange.poly([(0, 0), (1, 1)])
x
x

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

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Geração de imagens

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Parte 5

MIR
(Music Information Retrieval)
Retrieval)

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Pitch – Shepard
●

Som de Shepard
–
–

●

Subir “sem parar”
Exemplo no GitHub

Duas dimensões:
–

Altura (pitch height)
●

–

Dimensão “linear”

Croma (pitch chroma)
●
●

Dimensão “circular”
Lembra Escher →

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Série harmônica
●

F0, 2F0, 3F0, 4F0 …
–

100 Hz, 200 Hz, 300 Hz...

Inteiros?
Racionais?
Primos?
2+
oitava

Comb!

freqs = [str2freq(note) for note in "E2 G#2 B2".split()] # Mi maior
freqs = [str2freq(note) for note in "E2 G#2 B2".split()] # Mi maior
filt = ParallelFilter(comb.tau(freq_to_lag(freq * Hz), .1 * s)
filt = ParallelFilter(comb.tau(freq_to_lag(freq * Hz), .1 * s)
for freq in freqs)
for freq in freqs)
Centro de Convenções
AudioLazy – Danilo J. S. Bellini – @danilobellini
filt.plot(samples=8192, rate=rate, min_freq=220*Hz, max_freq=880*Hz).show()
filt.plot(samples=8192, rate=rate, min_freq=220*Hz, max_freq=880*Hz).show()
Ulysses Guimarães

Ulysses Guimarães

2013-10-03 – Brasília – DF
ZCR
Taxa de cruzamentos no zero
In [15]: pitch1.take(10) # Resultado em Hz
In [15]: pitch1.take(10) # Resultado em Hz
Out[15]:
Out[15]:
[872.0947265625001,
[872.0947265625001,
882.861328125,
882.861328125,
data1 = .5 * sinusoid(880 * Hz)
data1 = .5 * sinusoid(880 * Hz)
872.0947265625001,
872.0947265625001,
data1 += .5 * saw_table(880*3 * Hz)
data1 += .5 * saw_table(880*3 * Hz)
882.861328125,
882.861328125,
data1 *= .9 + .1 * white_noise()
data1 *= .9 + .1 * white_noise()
882.861328125,
882.861328125,
882.861328125,
882.861328125,
882.861328125,
882.861328125,
872.0947265625001,
872.0947265625001,
pitch1 = zcross_pitch(data1) / Hz
pitch1 = zcross_pitch(data1) / Hz
882.861328125,
882.861328125,
872.0947265625001]
872.0947265625001]

Por
não que
DFT
?

In [16]: freq2str(pitch1).take(10) # Resultado em nomes de notas
In [16]: freq2str(pitch1).take(10) # Resultado em nomes de notas
Out[16]:
Out[16]:
['A5+5.62%',
['A5+5.62%',
'A5+5.62%',
'A5+5.62%',
'A5+5.62%',
'A5+5.62%',
@tostream
@tostream
'A5+5.62%',
'A5+5.62%',
def zcross_pitch(sig, size=2048):
def zcross_pitch(sig, size=2048):
'A5+5.62%',
'A5+5.62%',
"Devolve a altura em cada bloco com o dado tamanho"
"Devolve a altura em cada bloco com o dado tamanho"
'A5-15.62%',
'A5-15.62%',
for blk in zcross(sig, hysteresis=.2).blocks(size):
for blk in zcross(sig, hysteresis=.2).blocks(size):
'A5+5.62%',
'A5+5.62%',
yield lag_to_freq(2. * size / sum(blk))
yield lag_to_freq(2. * size / sum(blk))
'A5-15.62%',
'A5-15.62%',
'A5+5.62%',
'A5+5.62%',
Centro de Convenções
AudioLazy – Danilo J. S. Bellini – @danilobellini
'A5+5.62%']
'A5+5.62%']

Ulysses Guimarães

2013-10-03 – Brasília – DF
AMDF (Average Magnitude Difference
Function)

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Autocorrelação
Transcrição por envoltória dinâmica

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Decomposição cromática
from __future__ import division
from __future__ import division
from audiolazy import *
from audiolazy import *
def cromafb(classes=12, rate):
def cromafb(classes=12, rate):
s, Hz = sHz(rate)
s, Hz = sHz(rate)
cg = gammatone_erb_constants(4)[0]
cg = gammatone_erb_constants(4)[0]
fb = 440
fb = 440
return [
return [
ParallelFilter(
ParallelFilter(
gammatone.sampled(f*Hz, cg*erb(f))
gammatone.sampled(f*Hz, cg*erb(f))
for f in octaves(fb * 2**(n/classes))
for f in octaves(fb * 2**(n/classes))
) for n in xrange(classes)
) for n in xrange(classes)
]
]
●

Filtros gammatone
–

●

Paralelo

rate = 44100
rate = 44100
bank = cromafb(rate=rate)
bank = cromafb(rate=rate)
bank[0].plot(freq_scale="log", rate=rate)
bank[0].plot(freq_scale="log", rate=rate)

Oitavas
In [1]: from audiolazy import octaves
In [1]: from audiolazy import octaves

In [2]: octaves(440)
In [2]: octaves(440)
Centro de Convenções
AudioLazy – Danilo J. S. Bellini – @danilobellini
Out[2]: [27.5, 55.0, 110.0, 220.0, 440, 880, 1760, 3520, 7040, 14080]
Out[2]: [27.5, 55.0, 110.0, 220.0, 440, 880, 1760, 3520, 7040, 14080]
Ulysses Guimarães
2013-10-03 – Brasília – DF
Cromagrama

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Envoltória espectral
LPC - Predição Linear

Formantes
Pode ser
utilizado para
classificação
de vogais
from audiolazy import *
from audiolazy import *

rate = 22050
rate = 22050
s, Hz = sHz(rate)
s, Hz = sHz(rate)
size = 512
size = 512
table = sin_table.harmonize({1: 1, 2: 5, 3: 3, 4: 2, 6: 9, 8: 1}).normalize()
table = sin_table.harmonize({1: 1, 2: 5, 3: 3, 4: 2, 6: 9, 8: 1}).normalize()
data = table(str2freq("Bb3")
data = table(str2freq("Bb3")
filt = lpc(data, order=14) #
filt = lpc(data, order=14) #
G = 1e-2 # Ganho apenas para
G = 1e-2 # Ganho apenas para

* Hz).take(size) # Nota si bemol da 3a oitava
* Hz).take(size) # Nota si bemol da 3a oitava
Filtro de análise
Filtro de análise
alinhamento na visualização com a DFT
alinhamento na visualização com a DFT

# Filtro de síntese AudioLazy – Danilo J. S. Bellini – @danilobellini
# Filtro de síntese
Centro de Convenções
(G / filt).plot(blk=data, rate=rate, samples=1024,DF
(G / filt).plot(blk=data, rate=rate, samples=1024, unwrap=False).show()
Ulysses Guimarães
2013-10-03 – Brasília – unwrap=False).show()
Parte 6

Finalização

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Situação atual e futuro da AudioLazy
●

Versão 0.05 (última “zero-zero”)
–

Compatibilidade entre Python 2 e 3!
●

–
●

Embora o MatPlotLib e o py.test sejam mais lento no Python 3, não é o caso c/ a AudioLazy

Exemplos práticos, refactoring, polinômios

Futuro (versão 0.1)
–
–

Sync para I/O (evita caching no Linux)

–

Personalização do AudioIO (dispositivo não padrão)

–
●

Filtros com expoentes inteiros variantes no tempo

Otimização para filtros comb

Projetos em desenvolvimento utilizando ou planejando utilizar a AudioLazy
–

●

Sintetizador, pedaleira, jogos, …

676 downloads realizados no último mês
–

PyPI, valor coletado dia 2013-10-03

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Possíveis continuações para o
desenvolvimento da AudioLazy
●

Análise

●

Heurísticas, MIR features

–

Plugins (Vamp)

Modelagem audição
–

–
●

●

–

Mock MatPlotLib

Filtros

Outros modelos (Lyon, Seneff, gamma
chirp, etc.)

●

Frações parciais

–

Escrita no tempo (linear e não-linear)
●

e.g. y[n] = x[n] + x[n -1] * x[n - 2]

–

SymPy (coeficientes e sinais simbólicos)

–

Wah, phaser, eco, compressor, noise gate,
…

Implementações alternativas

Host de plugins LADSPA

I/O

Flanger
Karplus-Strong variante no tempo

–

Exemplos de uso da AudioLazy

Integrar com PureData, CSound, etc.

Atrasos/expoentes fracionários variantes no
tempo
●

Conversão entre x-dB e ERB

●

–

Chegar aos 100%

–

Síntese e processamento
–

●

–
–

–

●

Testes

●
●

●

Treliça
Forma direta II

Outros
–

Logo

–

MIDI

–

Formatação da documentação (Sphinx)

–

Integrar com PyGame

–

Otimização

Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF
Obrigado!
Perguntas?

Fork me on GitHub
https://github.com/danilobellini/audiolazy
Centro de Convenções
Ulysses Guimarães

AudioLazy – Danilo J. S. Bellini – @danilobellini
2013-10-03 – Brasília – DF

Mais conteúdo relacionado

Semelhante a (2013-10-03) [PythonBrasil] AudioLazy, processamento de sinais para música, jogos e muito mais!

(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)
(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)
(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)Danilo J. S. Bellini
 
(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...
(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...
(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...Danilo J. S. Bellini
 
(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy
(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy
(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazyDanilo J. S. Bellini
 
(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3
(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3
(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3Danilo J. S. Bellini
 
(2013-07-05) [fisl] Compatibilidade entre Python 2 e 3
(2013-07-05) [fisl] Compatibilidade entre Python 2 e 3(2013-07-05) [fisl] Compatibilidade entre Python 2 e 3
(2013-07-05) [fisl] Compatibilidade entre Python 2 e 3Danilo J. S. Bellini
 

Semelhante a (2013-10-03) [PythonBrasil] AudioLazy, processamento de sinais para música, jogos e muito mais! (6)

(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)
(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)
(2013-11-29) [RuPy] AudioLazy Python DSP (Digital Signal Processing)
 
(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...
(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...
(2013-05-20) [DevInSampa] AudioLazy - DSP expressivo e em tempo real para o P...
 
(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy
(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy
(2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy
 
(2013-12-18) [Garoa HC] AudioLazy
(2013-12-18) [Garoa HC] AudioLazy(2013-12-18) [Garoa HC] AudioLazy
(2013-12-18) [Garoa HC] AudioLazy
 
(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3
(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3
(2013-10-02) [PythonBrasil] Compatibilidade entre Python 2 e 3
 
(2013-07-05) [fisl] Compatibilidade entre Python 2 e 3
(2013-07-05) [fisl] Compatibilidade entre Python 2 e 3(2013-07-05) [fisl] Compatibilidade entre Python 2 e 3
(2013-07-05) [fisl] Compatibilidade entre Python 2 e 3
 

Mais de Danilo J. S. Bellini

(2018-10-18) [ETEC Uirapuru] Segurança da Informação
(2018-10-18) [ETEC Uirapuru] Segurança da Informação(2018-10-18) [ETEC Uirapuru] Segurança da Informação
(2018-10-18) [ETEC Uirapuru] Segurança da InformaçãoDanilo J. S. Bellini
 
(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono
(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono
(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask AssíncronoDanilo J. S. Bellini
 
(2018-07-14) [Just Python] Números no Python!
(2018-07-14) [Just Python] Números no Python!(2018-07-14) [Just Python] Números no Python!
(2018-07-14) [Just Python] Números no Python!Danilo J. S. Bellini
 
(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)
(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)
(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)Danilo J. S. Bellini
 
(2017-07-22) [TDC] Audiolazy em 2017!
(2017-07-22) [TDC] Audiolazy em 2017!(2017-07-22) [TDC] Audiolazy em 2017!
(2017-07-22) [TDC] Audiolazy em 2017!Danilo J. S. Bellini
 
(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)
(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)
(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)Danilo J. S. Bellini
 
(2016-08-13) [Grupy-SP] Plugin pytest-doctest-custom v1.0.0
(2016-08-13) [Grupy-SP] Plugin pytest-doctest-custom v1.0.0(2016-08-13) [Grupy-SP] Plugin pytest-doctest-custom v1.0.0
(2016-08-13) [Grupy-SP] Plugin pytest-doctest-custom v1.0.0Danilo J. S. Bellini
 
(2015-03-14) [Grupy-SP] Projetos Open Source, como colaborar?
(2015-03-14) [Grupy-SP] Projetos Open Source, como colaborar?(2015-03-14) [Grupy-SP] Projetos Open Source, como colaborar?
(2015-03-14) [Grupy-SP] Projetos Open Source, como colaborar?Danilo J. S. Bellini
 
(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)
(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)
(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)Danilo J. S. Bellini
 
(2014-11-05) [PythonBrasil] Testando com py.test e tox
(2014-11-05) [PythonBrasil] Testando com py.test e tox(2014-11-05) [PythonBrasil] Testando com py.test e tox
(2014-11-05) [PythonBrasil] Testando com py.test e toxDanilo J. S. Bellini
 
(2014-10-27) [SETI-UFLA-MG] AudioLazy
(2014-10-27) [SETI-UFLA-MG] AudioLazy(2014-10-27) [SETI-UFLA-MG] AudioLazy
(2014-10-27) [SETI-UFLA-MG] AudioLazyDanilo J. S. Bellini
 
(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!
(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!
(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!Danilo J. S. Bellini
 
(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...
(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...
(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...Danilo J. S. Bellini
 
(2013-10-17) [LatinoWare] Automatizando o GIMP com Python
(2013-10-17) [LatinoWare] Automatizando o GIMP com Python(2013-10-17) [LatinoWare] Automatizando o GIMP com Python
(2013-10-17) [LatinoWare] Automatizando o GIMP com PythonDanilo J. S. Bellini
 
(2013-07-05) [fisl] Semáforo Gráfico dose para TDD em dojos
(2013-07-05) [fisl] Semáforo Gráfico dose para TDD em dojos(2013-07-05) [fisl] Semáforo Gráfico dose para TDD em dojos
(2013-07-05) [fisl] Semáforo Gráfico dose para TDD em dojosDanilo J. S. Bellini
 

Mais de Danilo J. S. Bellini (17)

(2018-10-18) [ETEC Uirapuru] Segurança da Informação
(2018-10-18) [ETEC Uirapuru] Segurança da Informação(2018-10-18) [ETEC Uirapuru] Segurança da Informação
(2018-10-18) [ETEC Uirapuru] Segurança da Informação
 
(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono
(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono
(2018-08-25) [Flask Conf] Introdução ao Sanic - O Flask Assíncrono
 
(2018-07-14) [Just Python] Números no Python!
(2018-07-14) [Just Python] Números no Python!(2018-07-14) [Just Python] Números no Python!
(2018-07-14) [Just Python] Números no Python!
 
(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)
(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)
(2017-08-12) [GruPy-SP] AudioLazy no GruPy! (+LV2)
 
(2017-07-22) [TDC] Audiolazy em 2017!
(2017-07-22) [TDC] Audiolazy em 2017!(2017-07-22) [TDC] Audiolazy em 2017!
(2017-07-22) [TDC] Audiolazy em 2017!
 
(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)
(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)
(2017-05-27) [Grupy-SP] Polígonos, pontos e outras geometrias no Shapely (GIS)
 
(2016-08-13) [Grupy-SP] Plugin pytest-doctest-custom v1.0.0
(2016-08-13) [Grupy-SP] Plugin pytest-doctest-custom v1.0.0(2016-08-13) [Grupy-SP] Plugin pytest-doctest-custom v1.0.0
(2016-08-13) [Grupy-SP] Plugin pytest-doctest-custom v1.0.0
 
(2015-03-14) [Grupy-SP] Projetos Open Source, como colaborar?
(2015-03-14) [Grupy-SP] Projetos Open Source, como colaborar?(2015-03-14) [Grupy-SP] Projetos Open Source, como colaborar?
(2015-03-14) [Grupy-SP] Projetos Open Source, como colaborar?
 
(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)
(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)
(2015-01-29/30) [WTA2015] Adaptatividade em Python (Tutorial)
 
(2014-11-05) [PythonBrasil] Testando com py.test e tox
(2014-11-05) [PythonBrasil] Testando com py.test e tox(2014-11-05) [PythonBrasil] Testando com py.test e tox
(2014-11-05) [PythonBrasil] Testando com py.test e tox
 
(2014-10-27) [SETI-UFLA-MG] AudioLazy
(2014-10-27) [SETI-UFLA-MG] AudioLazy(2014-10-27) [SETI-UFLA-MG] AudioLazy
(2014-10-27) [SETI-UFLA-MG] AudioLazy
 
(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!
(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!
(2014-08-09) [TDC] AudioLazy 0.6 will robotize you!
 
(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...
(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...
(2014-05-24) [Taubaté Perl Mongers] AudioLazy Python DSP (Digital Signal Proc...
 
(2014-04-16) [Garoa HC] Strategy
(2014-04-16) [Garoa HC] Strategy(2014-04-16) [Garoa HC] Strategy
(2014-04-16) [Garoa HC] Strategy
 
(2014-03-26) [7masters] AudioLazy
(2014-03-26) [7masters] AudioLazy(2014-03-26) [7masters] AudioLazy
(2014-03-26) [7masters] AudioLazy
 
(2013-10-17) [LatinoWare] Automatizando o GIMP com Python
(2013-10-17) [LatinoWare] Automatizando o GIMP com Python(2013-10-17) [LatinoWare] Automatizando o GIMP com Python
(2013-10-17) [LatinoWare] Automatizando o GIMP com Python
 
(2013-07-05) [fisl] Semáforo Gráfico dose para TDD em dojos
(2013-07-05) [fisl] Semáforo Gráfico dose para TDD em dojos(2013-07-05) [fisl] Semáforo Gráfico dose para TDD em dojos
(2013-07-05) [fisl] Semáforo Gráfico dose para TDD em dojos
 

Último

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx2m Assessoria
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx2m Assessoria
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploDanilo Pinotti
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx2m Assessoria
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsDanilo Pinotti
 

Último (6)

ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 

(2013-10-03) [PythonBrasil] AudioLazy, processamento de sinais para música, jogos e muito mais!

  • 1. AudioLazy processamento de sinais para música, jogos e muito mais! http://pypi.python.org/pypi/audiolazy Copyright (C) 2012-2013 Danilo de Jesus da Silva Bellini danilo.bellini@gmail.com @danilobellini Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 2. ● c/ Pyth o m on AudioLazy es 2e mo có 3 dig DSP (Digital Signal Processing) para áudio o – Análise ● MIR (Music Information Retrieval) – – ● Síntese Processamento Expressividade de código – ● Documentação (Sphinx) http://pythonhosted.org/audiolazy Facilita prototipação, simulação Tempo real (latência de aproximadamente 35ms c/ o Jack) – Possibilita uso em aplicações finais Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF !
  • 3. Resultados cobertura de código Oráculos (Testes automatizados) (NumPy, SciPy) --------------- coverage: platform linux2, python 2.7.3-final-0 ------------------------------ coverage: platform linux2, python 2.7.3-final-0 ---------------Name Stmts Miss Branch BrPart Cover Missing Name Stmts Miss Branch BrPart Cover Missing ----------------------------------------------------------------------------------------------------------------------Mock __init__ 44 1 18 4 92% 72 __init__ 44 1 18 4 92% 72 lazy_analysis 125 3 60 2 97% 211, 259-260 lazy_analysis 125 3 60 2 97% 211, 259-260 lazy_auditory 60 0 14 0 100% lazy_auditory 60 0 14 0 100% lazy_compat 42 5 6 1 88% 43, 67-68, 78-79 lazy_compat 42 5 6 1 88% 43, 67-68, 78-79 lazy_core 175 7 80 9 94% 124, 136-138, 346, 471, 478 lazy_core 175 7 80 9 94% 124, 136-138, 346, 471, 478 lazy_filters 521 176 247 115 62% 57, 64, 85, 95, [...] lazy_filters 521 176 247 115 62% 57, 64, 85, 95, [...] lazy_io 156 43 58 28 67% 89, 141-157, 161, [...] lazy_io 156 43 58 28 67% 89, 141-157, 161, [...] lazy_itertools 41 7 20 11 70% 39, 60-61, 66, 108-111 lazy_itertools 41 7 20 11 70% 39, 60-61, 66, 108-111 lazy_lpc 128 15 42 7 87% 121, 135-136, [...] lazy_lpc 128 15 42 7 87% 121, 135-136, [...] lazy_math 61 1 28 0 99% 133 lazy_math 61 1 28 0 99% 133 lazy_midi 54 5 26 3 90% 70, 111, 150, 156, 158 lazy_midi 54 5 26 3 90% 70, 111, 150, 156, 158 lazy_misc 110 9 62 10 89% 156-157, 194, [...] lazy_misc 110 9 62 10 89% 156-157, 194, [...] lazy_poly 191 2 126 3 98% 396-397 lazy_poly 191 2 126 3 98% 396-397 lazy_stream 175 2 76 4 98% 59, 738 lazy_stream 175 2 76 4 98% 59, 738 lazy_synth 251 32 124 40 81% 278-300, 467, 469, [...] lazy_synth 251 32 124 40 81% 278-300, 467, 469, [...] lazy_text 102 33 70 29 64% 132-147, 205-229, [...] lazy_text 102 33 70 29 64% 132-147, 205-229, [...] ----------------------------------------------------------------------------------------------------------------------TOTAL 2236 341 1057 266 82% TOTAL 2236 341 1057 266 82% ========================= 2310 passed in 22.36 seconds ========================= ========================= 2310 passed in 22.36 seconds ========================= Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 4. Parte 1 Síntese Go go go! Não, é Python! Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 5. “Hello world” em áudio ● Tocar uma senóide – Console from audiolazy import * from audiolazy import * (e.g. IPython) rate = 44100 rate = 44100 s, Hz = sHz(rate) s, Hz = sHz(rate) Multith rea player = AudioIO() player = AudioIO() snd = sinusoid(440 * Hz).limit(2 snd = sinusoid(440 * Hz).limit(2 th = player.play(snd, rate=rate) th = player.play(snd, rate=rate) * * # # d! s) s) an AudioThread an AudioThread player.close() # Kill th (AudioIO arg isn't true) player.close() # Kill th (AudioIO arg isn't true) – Scripts podem usar gerenciadores de contexto with AudioIO(True) as player: # Wait threads with AudioIO(True) as player: # Wait threads player.play(snd, rate=rate) player.play(snd, rate=rate) – Dados “rate”, “s”, “Hz”, “AudioIO” e “sinusoid”: AudioIO(True).play(sinusoid(440 * Hz).limit(2 * s), rate=rate) AudioIO(True).play(sinusoid(440 * Hz).limit(2 * s), rate=rate) Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 6. Notas/Alturas e MIDI Pitch ● Notas/alturas – D = Ré – E = Mi – F = Fá – A = Lá – B = Si – – ● MIDI Pitch – str2freq – “Cb4” (dó bemol) é a mesma nota que B3 freq2str – Ignoram a alteração str2midi – Iniciam em dó midi2str – Oitavas – ● Todas as combinações G = Sol – ● C = Dó – ● midi2freq – freq2midi Define 69 como A4 (lá central), deslocamento em semitons Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 7. ● Controle e tipos de síntese Ex ControlStream em plo Property “value” s!! wx Permite interatividade ! Py Tempo real Mu tho Síntese sic n, Aditiva (e.g. classe TableLookup) 21 Modulação – – ● ● – – ● Ring Modulation (Anel) – ● AM (Amplitude) – ● Senóide * (1 + Senóide) FM (Frequência ou fase) – – Senóide * Senóide Senóide(Senóide) Subtrativa (e.g. modelo de Karplus-Strong) Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF Imagem da Wikipedia
  • 8. Parte 2 Representação Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 9. Container para áudio ● Tempo real – Amostras (dados/elementos) inexistentes... ● ● ...em tempo de compilação (dados a serem coletados) ...em tempo de execução (dados criados no futuro) – Duração possivelmente indefinida (endless) – Não deve ser necessário computar tudo para começar a apresentar o resultado ● ● Resultados parciais Para cada amostra de entrada, deve haver uma de saída – Minimizar lag (atraso) entre entrada e saída Laziness! Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 10. Classe Stream In [1]: data = Stream(range(7)) In [1]: data = Stream(range(7)) ● Iterável In [2]: blks = data.blocks(size=3, hop=2) In [2]: blks = data.blocks(size=3, hop=2) ● Heterogêneo In [3]: [list(blk) for blk in blks] In [3]: [list(blk) for blk in blks] Out[3]: [[0, 1, 2], [2, 3, 4], [4, 5, 6]] Out[3]: [[0, 1, 2], [2, 3, 4], [4, 5, 6]] ● Lazy! (Avaliação tardia) ● Operadores (Elementwise/broadcast) ● Métodos (take, peek, limit, skip, map, filter, blocks) In In In In In In [1]: [1]: [2]: [2]: [3]: [3]: from audiolazy import Stream, inf from audiolazy import Stream, inf dados = Stream(5, 7, 1, 2, 5, 3, 2) # Periódico dados = Stream(5, 7, 1, 2, 5, 3, 2) # Periódico dados2 = Stream(0, 1) # Idem dados2 = Stream(0, 1) # Idem In [4]: In [4]: Out[4]: Out[4]: (dados (dados [5, 8, [5, 8, In [5]: In [5]: Out[5]: Out[5]: (_ * Stream(1 + 2j, -3j, 7).imag).map(int).take(inf) (_ * Stream(1 + 2j, -3j, 7).imag).map(int).take(inf) [2.0, 0.0, 14] [2.0, 0.0, 14] Centro de Convenções Ulysses Guimarães + dados2).take(15) + dados2).take(15) 1, 3, 5, 4, 2, 6, 7, 2, 2, 6, 3, 3, 5] 1, 3, 5, 4, 2, 6, 7, 2, 2, 6, 3, 3, 5] AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 11. Parte 3 Filtros digitais e a Transformada Z Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 12. Filtros LTI (Lineares e invariantes no tempo) “Digital signal processing is mainly based on linear time-invariant systems.” systems.” (Dutilleux, Dempwolf, Holters e Zölzer DAFx, segunda edição, capítulo 4, p. 103) Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 13. Transformada Z ● Definição: ● Interpretação: Atraso em k amostras! In [1]: from audiolazy import z, inf In [1]: from audiolazy import z, inf In [2]: sig = [1, 2, 3, 4, 5, 6, 7] In [2]: sig = [1, 2, 3, 4, 5, 6, 7] In [3]: In [3]: Out[3]: Out[3]: (z ** (z ** [0.0, [0.0, -2)(sig).take(inf) -2)(sig).take(inf) 0.0, 1, 2, 3, 4, 5] 0.0, 1, 2, 3, 4, 5] In [4]: In [4]: Out[4]: Out[4]: (1 - z ** -2)(sig).take(inf) (1 - z ** -2)(sig).take(inf) [1.0, 2.0, 2, 2, 2, 2, 2] [1.0, 2.0, 2, 2, 2, 2, 2] Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 14. Objeto “z” In [1]: from audiolazy import z, Stream, maverage In [1]: from audiolazy import z, Stream, maverage In [2]: M = 5 In [2]: M = 5 In [3]: media_movel_5 = (1 - z ** -M) / (M * (1 - z ** -1)) In [3]: media_movel_5 = (1 - z ** -M) / (M * (1 - z ** -1)) In [4]: acumulador = 1 / (1 - z ** -1) In [4]: acumulador = 1 / (1 - z ** -1) In [5]: In [5]: Out[5]: Out[5]: media_movel_5(Stream(5)).take(10) media_movel_5(Stream(5)).take(10) [1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0] [1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0] In [6]: acumulador(Stream(5)).take(10) In [6]: acumulador(Stream(5)).take(10) Out[6]: [5.0, 10.0, 15.0, 20.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0] Out[6]: [5.0, 10.0, 15.0, 20.0, 25.0, 30.0, 35.0, 40.0, 45.0, 50.0] In [7]: maverage.recursive(4) In [7]: maverage.recursive(4) Out[7]: Out[7]: 0.25 - 0.25 * z^-4 0.25 - 0.25 * z^-4 ----------------------------------1 - z^-1 1 - z^-1 Filtros LTI, em geral: Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 15. Filtros prontos! ● ● ● ● ● JIT! Filtr Coe os varia Média móvel ntes parc ficien no t tes ( elas Ressonadores e mp fato “a * r o obje z ** -k” es “a” e ! Comb tos S ) po m trea dem s Passa-baixas e passa-altas m) er Gammatone (Patterson-Holdsworth, audição) – Slaney – Klapuri ● – 4 ressonadores em cascata Implementação genérica (qualquer ordem) ● Teoremas (parte de meu mestrado) Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 16. Plot (AudioLazy + MatPlotLib)! ● DTFT - Caso particular da transformada Z – ● Método plot dos filtros – ● O valor de z está na circunferência complexa unitária Resposta em frequência Método zplot – Estabilidade do filtro – X Pólos: “X” ● – Raízes do denominador Zeros: “O” ● X Raízes do numerador Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF MatPlotLib faz melhor que isto...
  • 17. Parte 4 Aplicações inusitadas Cálculo numérico Geração de imagens Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 18. Pi! ● Exemplo no repositório da AudioLazy ● Série de Madhava-Gregory-Leibniz 3 5 7 9 v v v v atan (v)=v − + − + ... 3 5 7 9 π atan(1)= 4 ● Fórmula de Machin π =atan 1 + atan 1 4 5 239 () Centro de Convenções Ulysses Guimarães ( ) AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 19. Fibonacci ● h[0] = 0 ● h[1] = 1 ● h[n] = h[n-1] + h[n-2] – ● Pode-se interpretar como [0, 1, 0, 0, 0, 0, ...] aplicado ao filtro digital com esta equação impulse() é o iterável [1, 0, 0, 0, 0, …] h [n]=h[n−1]+ h[ n−2]+ δ[ n−1] In [2]: In [2]: Out[2]: Out[2]: (z ** -1 / (1 (z ** -1 / (1 [0, 1, 1, 2, 3, [0, 1, 1, 2, 3, Centro de Convenções Ulysses Guimarães z ** -1 z ** -1 5, 8, 13, 5, 8, 13, z ** -2))(impulse()).map(int).take(16) z ** -2))(impulse()).map(int).take(16) 21, 34, 55, 89, 144, 233, 377, 610] 21, 34, 55, 89, 144, 233, 377, 610] AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 20. Polinômios ● Baseados em dicionário In [7]: (x + x ** 2 + x ** -.5)(4) In [7]: (x + x ** 2 + x ** -.5)(4) Out[7]: 20.5 Out[7]: 20.5 – Memória – Expoente negativo (Laurent) – Expoente fracionário (soma de potências) ● Objeto “x” ● Interpolação – Lagrange In [9]: In [9]: Out[9]: Out[9]: lagrange.poly([(0, 0), (1, 1)]) lagrange.poly([(0, 0), (1, 1)]) x x In [10]: lagrange.poly([(0, 0), (1, 1), (2, 2)]) In [10]: lagrange.poly([(0, 0), (1, 1), (2, 2)]) Out[10]: x Out[10]: x In [11]: lagrange.poly([(0, 0), (1, 1), (2, 4)]) In [11]: lagrange.poly([(0, 0), (1, 1), (2, 4)]) Out[11]: x^2 Out[11]: x^2 In [9]: lagrange.poly([(1, 3), (3, 14), (45, 0)]) In [9]: lagrange.poly([(1, 3), (3, 14), (45, 0)]) Out[9]: -2.89773 + 6.0303 * x - 0.132576 * x^2 Out[9]: -2.89773 + 6.0303 * x - 0.132576 * x^2 Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 21. Geração de imagens Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 22. Parte 5 MIR (Music Information Retrieval) Retrieval) Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 23. Pitch – Shepard ● Som de Shepard – – ● Subir “sem parar” Exemplo no GitHub Duas dimensões: – Altura (pitch height) ● – Dimensão “linear” Croma (pitch chroma) ● ● Dimensão “circular” Lembra Escher → Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 24. Série harmônica ● F0, 2F0, 3F0, 4F0 … – 100 Hz, 200 Hz, 300 Hz... Inteiros? Racionais? Primos? 2+ oitava Comb! freqs = [str2freq(note) for note in "E2 G#2 B2".split()] # Mi maior freqs = [str2freq(note) for note in "E2 G#2 B2".split()] # Mi maior filt = ParallelFilter(comb.tau(freq_to_lag(freq * Hz), .1 * s) filt = ParallelFilter(comb.tau(freq_to_lag(freq * Hz), .1 * s) for freq in freqs) for freq in freqs) Centro de Convenções AudioLazy – Danilo J. S. Bellini – @danilobellini filt.plot(samples=8192, rate=rate, min_freq=220*Hz, max_freq=880*Hz).show() filt.plot(samples=8192, rate=rate, min_freq=220*Hz, max_freq=880*Hz).show() Ulysses Guimarães Ulysses Guimarães 2013-10-03 – Brasília – DF
  • 25. ZCR Taxa de cruzamentos no zero In [15]: pitch1.take(10) # Resultado em Hz In [15]: pitch1.take(10) # Resultado em Hz Out[15]: Out[15]: [872.0947265625001, [872.0947265625001, 882.861328125, 882.861328125, data1 = .5 * sinusoid(880 * Hz) data1 = .5 * sinusoid(880 * Hz) 872.0947265625001, 872.0947265625001, data1 += .5 * saw_table(880*3 * Hz) data1 += .5 * saw_table(880*3 * Hz) 882.861328125, 882.861328125, data1 *= .9 + .1 * white_noise() data1 *= .9 + .1 * white_noise() 882.861328125, 882.861328125, 882.861328125, 882.861328125, 882.861328125, 882.861328125, 872.0947265625001, 872.0947265625001, pitch1 = zcross_pitch(data1) / Hz pitch1 = zcross_pitch(data1) / Hz 882.861328125, 882.861328125, 872.0947265625001] 872.0947265625001] Por não que DFT ? In [16]: freq2str(pitch1).take(10) # Resultado em nomes de notas In [16]: freq2str(pitch1).take(10) # Resultado em nomes de notas Out[16]: Out[16]: ['A5+5.62%', ['A5+5.62%', 'A5+5.62%', 'A5+5.62%', 'A5+5.62%', 'A5+5.62%', @tostream @tostream 'A5+5.62%', 'A5+5.62%', def zcross_pitch(sig, size=2048): def zcross_pitch(sig, size=2048): 'A5+5.62%', 'A5+5.62%', "Devolve a altura em cada bloco com o dado tamanho" "Devolve a altura em cada bloco com o dado tamanho" 'A5-15.62%', 'A5-15.62%', for blk in zcross(sig, hysteresis=.2).blocks(size): for blk in zcross(sig, hysteresis=.2).blocks(size): 'A5+5.62%', 'A5+5.62%', yield lag_to_freq(2. * size / sum(blk)) yield lag_to_freq(2. * size / sum(blk)) 'A5-15.62%', 'A5-15.62%', 'A5+5.62%', 'A5+5.62%', Centro de Convenções AudioLazy – Danilo J. S. Bellini – @danilobellini 'A5+5.62%'] 'A5+5.62%'] Ulysses Guimarães 2013-10-03 – Brasília – DF
  • 26. AMDF (Average Magnitude Difference Function) Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 27. Autocorrelação Transcrição por envoltória dinâmica Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 28. Decomposição cromática from __future__ import division from __future__ import division from audiolazy import * from audiolazy import * def cromafb(classes=12, rate): def cromafb(classes=12, rate): s, Hz = sHz(rate) s, Hz = sHz(rate) cg = gammatone_erb_constants(4)[0] cg = gammatone_erb_constants(4)[0] fb = 440 fb = 440 return [ return [ ParallelFilter( ParallelFilter( gammatone.sampled(f*Hz, cg*erb(f)) gammatone.sampled(f*Hz, cg*erb(f)) for f in octaves(fb * 2**(n/classes)) for f in octaves(fb * 2**(n/classes)) ) for n in xrange(classes) ) for n in xrange(classes) ] ] ● Filtros gammatone – ● Paralelo rate = 44100 rate = 44100 bank = cromafb(rate=rate) bank = cromafb(rate=rate) bank[0].plot(freq_scale="log", rate=rate) bank[0].plot(freq_scale="log", rate=rate) Oitavas In [1]: from audiolazy import octaves In [1]: from audiolazy import octaves In [2]: octaves(440) In [2]: octaves(440) Centro de Convenções AudioLazy – Danilo J. S. Bellini – @danilobellini Out[2]: [27.5, 55.0, 110.0, 220.0, 440, 880, 1760, 3520, 7040, 14080] Out[2]: [27.5, 55.0, 110.0, 220.0, 440, 880, 1760, 3520, 7040, 14080] Ulysses Guimarães 2013-10-03 – Brasília – DF
  • 29. Cromagrama Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 30. Envoltória espectral LPC - Predição Linear Formantes Pode ser utilizado para classificação de vogais from audiolazy import * from audiolazy import * rate = 22050 rate = 22050 s, Hz = sHz(rate) s, Hz = sHz(rate) size = 512 size = 512 table = sin_table.harmonize({1: 1, 2: 5, 3: 3, 4: 2, 6: 9, 8: 1}).normalize() table = sin_table.harmonize({1: 1, 2: 5, 3: 3, 4: 2, 6: 9, 8: 1}).normalize() data = table(str2freq("Bb3") data = table(str2freq("Bb3") filt = lpc(data, order=14) # filt = lpc(data, order=14) # G = 1e-2 # Ganho apenas para G = 1e-2 # Ganho apenas para * Hz).take(size) # Nota si bemol da 3a oitava * Hz).take(size) # Nota si bemol da 3a oitava Filtro de análise Filtro de análise alinhamento na visualização com a DFT alinhamento na visualização com a DFT # Filtro de síntese AudioLazy – Danilo J. S. Bellini – @danilobellini # Filtro de síntese Centro de Convenções (G / filt).plot(blk=data, rate=rate, samples=1024,DF (G / filt).plot(blk=data, rate=rate, samples=1024, unwrap=False).show() Ulysses Guimarães 2013-10-03 – Brasília – unwrap=False).show()
  • 31. Parte 6 Finalização Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 32. Situação atual e futuro da AudioLazy ● Versão 0.05 (última “zero-zero”) – Compatibilidade entre Python 2 e 3! ● – ● Embora o MatPlotLib e o py.test sejam mais lento no Python 3, não é o caso c/ a AudioLazy Exemplos práticos, refactoring, polinômios Futuro (versão 0.1) – – Sync para I/O (evita caching no Linux) – Personalização do AudioIO (dispositivo não padrão) – ● Filtros com expoentes inteiros variantes no tempo Otimização para filtros comb Projetos em desenvolvimento utilizando ou planejando utilizar a AudioLazy – ● Sintetizador, pedaleira, jogos, … 676 downloads realizados no último mês – PyPI, valor coletado dia 2013-10-03 Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 33. Possíveis continuações para o desenvolvimento da AudioLazy ● Análise ● Heurísticas, MIR features – Plugins (Vamp) Modelagem audição – – ● ● – Mock MatPlotLib Filtros Outros modelos (Lyon, Seneff, gamma chirp, etc.) ● Frações parciais – Escrita no tempo (linear e não-linear) ● e.g. y[n] = x[n] + x[n -1] * x[n - 2] – SymPy (coeficientes e sinais simbólicos) – Wah, phaser, eco, compressor, noise gate, … Implementações alternativas Host de plugins LADSPA I/O Flanger Karplus-Strong variante no tempo – Exemplos de uso da AudioLazy Integrar com PureData, CSound, etc. Atrasos/expoentes fracionários variantes no tempo ● Conversão entre x-dB e ERB ● – Chegar aos 100% – Síntese e processamento – ● – – – ● Testes ● ● ● Treliça Forma direta II Outros – Logo – MIDI – Formatação da documentação (Sphinx) – Integrar com PyGame – Otimização Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF
  • 34. Obrigado! Perguntas? Fork me on GitHub https://github.com/danilobellini/audiolazy Centro de Convenções Ulysses Guimarães AudioLazy – Danilo J. S. Bellini – @danilobellini 2013-10-03 – Brasília – DF