(2014-10-27) [seti-ufla-mg] audiolazy
DESCRIPTION
Palestra sobre a AudioLazy apresentada na UFLA (Universidade Federal de Lavras), Minas Gerais, no dia 2014-10-27, durante a SETI (Semana de Tecnologia da Informação). http://seti.compjunior.com.br/ Descrição da palestra: Distorcendo áudio em tempo real com uma ou poucas linhas de de código! A palestra incluirá exemplos prontos e enfatizará os novos recursos da AudioLazy 0.6, com demonstrações ao vivo. Muito conteúdo de análise, síntese e processamento de áudio, além de psicoacústica, imagens, entre outros.TRANSCRIPT
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazyAudioLazyDanilo de Jesus da Silva BelliniDanilo de Jesus da Silva Bellini
(Desenvolvedor da AudioLazy)(Desenvolvedor da AudioLazy)
Twitter:Twitter: @danilobellini @danilobellini
https://github.com/danilobellini/audiolazyhttps://github.com/danilobellini/audiolazy
https://pypi.python.org/pypi/audiolazyhttps://pypi.python.org/pypi/audiolazy
https://groups.google.com/forum/#!https://groups.google.com/forum/#!forum/audiolazyforum/audiolazy
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazyAudioLazy
● DSP (DSP (Digital Signal ProcessingDigital Signal Processing))– AnáliseAnálise
– SínteseSíntese
– ProcessamentoProcessamento
– PsicoacústicaPsicoacústica
● Expressividade de códigoExpressividade de código● Tempo realTempo real
Documentação (Sphinx)http://pythonhosted.org/audiolazy
Python 2.7
Python 2.7
e 3.2+!e 3.2+!
86% py.test branch
coverage
Cálculo numérico
Imagens
...
Game: Musical Mines!https://github.com/danilobellini/mmines
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
““Hello world”Hello world”
● Tocar uma senóideTocar uma senóide– ConsoleConsole
(e.g. IPython)(e.g. IPython)
– ScriptsScripts● Gerenciadores de contextoGerenciadores 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)
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, api="jack") as player: # True = wait all audio player.play(snd, rate=rate) # threads finishwith AudioIO(True, api="jack") as player: # True = wait all audio player.play(snd, rate=rate) # threads finish
Multithread!
ALSA/Jack/... via PyAudio(PortAudio)
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
Iterável = áudio!Iterável = áudio!● ControlStreamControlStream
– InteratividadeInteratividade
● StreamStream– LazyLazy
– Operadores elementwise/broadcastOperadores elementwise/broadcast
– Métodos take, peek, limit, skip, map, filter e blocksMétodos take, peek, limit, skip, map, filter e blocks
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]
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]
In [1]: from audiolazy import Stream, inf, count, cycle # itertools-likeIn [2]: dados = Stream(-5j, 7j, 1, 1+2j, 5, 3, 2) # PeriódicoIn [3]: dados2 = Stream(0, 2j) # Idem
In [4]: (dados * dados2).take(15)Out[4]: [0j, (-14+0j), 0, (-4+2j), 0, 6j, 0, (10+0j), 0j, 2j, 0j, 10j, 0, 4j, 0j]
In [5]: (cycle(_).limit(5).imag * 1j + count(start=1, step=2)).take(inf)Out[5]: [(1+0j), (3+0j), (5+0j), (7+2j), (9+0j)]
In [1]: from audiolazy import Stream, inf, count, cycle # itertools-likeIn [2]: dados = Stream(-5j, 7j, 1, 1+2j, 5, 3, 2) # PeriódicoIn [3]: dados2 = Stream(0, 2j) # Idem
In [4]: (dados * dados2).take(15)Out[4]: [0j, (-14+0j), 0, (-4+2j), 0, 6j, 0, (10+0j), 0j, 2j, 0j, 10j, 0, 4j, 0j]
In [5]: (cycle(_).limit(5).imag * 1j + count(start=1, step=2)).take(inf)Out[5]: [(1+0j), (3+0j), (5+0j), (7+2j), (9+0j)]
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
Notas/Alturas e MIDI PitchNotas/Alturas e MIDI Pitch
● Pitch (notas/alturas)Pitch (notas/alturas)
● Com oitavas!Com oitavas!– Iniciam em dóIniciam em dó
● MIDI PitchMIDI Pitch– Em semitonsEm semitons
● Funções para realizar Funções para realizar conversõesconversões– midi2strmidi2str
– str2midistr2midi
– freq2strfreq2str
– str2freqstr2freq
– midi2freqmidi2freq
– freq2midifreq2midi
C D E F G A B
Do Re Mi Fa Sol La Si
>>> str2midi("Cb4") == str2midi("B3")True>>> str2midi("Cb4") == str2midi("B3")True
>>> str2midi("A4") # La central69>>> str2midi("Bb4")70>>> str2midi("C5")72
>>> str2midi("A4") # La central69>>> str2midi("Bb4")70>>> str2midi("C5")72
Outras conversões
lag2freqfreq2lagphon2dB
dB10dB20
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
LoudnessLoudnessModelo de Fletcher-Munson (1933)“Loudness, Its Definition, Measurement and Calculation”
ISO/FDIS 226:2003Imagem obtida a partir do exemplo iso226_plot.py
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
Altura (pitch)! ShepardAltura (pitch)! Shepard
● 2 dimensões:2 dimensões:– Altura (Altura (pitch heightpitch height))
● Dimensão “linear”Dimensão “linear”
– Croma (Croma (pitch chromapitch chroma))● Dimensão “circular”Dimensão “circular”● Lembra Escher →Lembra Escher →
Exemplo shepard.pyExemplo shepard.py
““Hélice”Hélice”
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
Demonstrations to Demonstrations to ASA (Bregman)ASA (Bregman)
Ruído Ruído (experimento 34)(experimento 34)
Exemplo butterworth_with_noise.pyExemplo butterworth_with_noise.py
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
SínteseSíntese
● ModulaçãoModulação– Ring/anelRing/anel
– AMAM
– FMFM
● Síntese aditivaSíntese aditiva● Síntese subtrativaSíntese subtrativa● Formas de ondaFormas de onda
– SenoidesSenoides
– SawtoothSawtooth
– Table lookupTable lookup
● RuídoRuído– Branco/uniformeBranco/uniforme– GaussianoGaussiano
● ExemplosExemplos– FM: mcfm.pyFM: mcfm.py
– Subtrativa: formants.pySubtrativa: formants.py– Aditiva com senoides: Aditiva com senoides:
shepard.pyshepard.py
keyboard.py:
GGGSUGSUGLLLPUTSUG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
Envoltória espectralEnvoltória espectralFormantesFormantes
Modelo fonte-filtro Modelo fonte-filtro para a vozpara a voz
LPC (Linear LPC (Linear Predictive Coding)Predictive Coding)
Classificação de Classificação de vogaisvogais
(análise e síntese)(análise e síntese)
lpc_plot.pylpc_plot.pyformants.pyformants.py
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AnáliseAnálise
ZCRZCR– Taxa de cruzamento no Taxa de cruzamento no
zerozero
AMDFAMDF– Average Magnitude Average Magnitude
Difference FunctionDifference Function
......
● DFT (Transformada Discreta de Fourier)DFT (Transformada Discreta de Fourier)– Usando com Numpy/ScipyUsando com Numpy/Scipy
● Funções de janelamentoFunções de janelamento– Processamento (STFT)Processamento (STFT)
– Projeto de filtrosProjeto de filtros
dft_pitch.pydft_pitch.pyzcross_pitch.pyzcross_pitch.pyanimated_plot.pyanimated_plot.py
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
Filtros LTIFiltros LTI(Lineares e invariantes no tempo)(Lineares e invariantes no tempo)
““Digital signal processing is mainly Digital signal processing is mainly based on linear time-invariant systems.based on linear time-invariant systems.””
(Dutilleux, Dempwolf, Holters e Zölzer(Dutilleux, Dempwolf, Holters e ZölzerDAFx, segunda edição, capítulo 4, p. 103)DAFx, segunda edição, capítulo 4, p. 103)
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
Transformada ZTransformada Z
● Definição:Definição:
● Interpretação:Interpretação:
AtrasoAtraso em k em k amostras!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]
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]
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
Filtros linearesFiltros lineares● Síntese subtrativa (e.g. play_bach_choral.py)Síntese subtrativa (e.g. play_bach_choral.py)● Comb, ressonador, passa-baixas, passa-altas, …Comb, ressonador, passa-baixas, passa-altas, …● Wah, knob guitarra (passa-baixas RC), ...Wah, knob guitarra (passa-baixas RC), ...
filt = 1./9. * (4 - z ** -2) / (1 + .8 * z ** -1 + .4 * z ** -2)filt.zplot().savefig("zeropolo.pdf")
fcomb = comb.fb(25, .95)fcomb.plot().savefig("plot-comb.pdf")
filt = 1./9. * (4 - z ** -2) / (1 + .8 * z ** -1 + .4 * z ** -2)filt.zplot().savefig("zeropolo.pdf")
fcomb = comb.fb(25, .95)fcomb.plot().savefig("plot-comb.pdf")
1 2
1
2
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
ProcessamentoProcessamento
● DistorçãoDistorção● FlangerFlanger● PhaserPhaser● WahWah● Robotização de vozRobotização de voz● DelayDelay● ReverbReverb● ……
STFT!
Arquivos WAV
ou ao vivo?
W = window.hannrobotize = stft(abs, size=1024, hop=441, wnd=w, ola_wnd=w) # Hint: usar também before=None# [...] e no io_wire.pyraw = pr.record(rate=rate)pr.play(robotize(raw), rate=rate)
W = window.hannrobotize = stft(abs, size=1024, hop=441, wnd=w, ola_wnd=w) # Hint: usar também before=None# [...] e no io_wire.pyraw = pr.record(rate=rate)pr.play(robotize(raw), rate=rate)
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
https://github.com/RicardoBoccoliGallego/DigitalPedalBoard
Pedaleira feita Pedaleira feita com a com a
AudioLazy + AudioLazy + PySerial (com PySerial (com Arduino) por 4 Arduino) por 4
alunos da alunos da Poli-USPPoli-USP
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
Em andamento...Em andamento...
● lz2lv2lz2lv2– Criação de plugins LV2 usando Python + AudioLazyCriação de plugins LV2 usando Python + AudioLazy
– Apenas geração de metadados (Turtle) no momentoApenas geração de metadados (Turtle) no momento
● lz-plugins-lv2lz-plugins-lv2– Coletânea de plugins LV2 usando PythonColetânea de plugins LV2 usando Python
– Apenas “robotize” no momentoApenas “robotize” no momento
LV2 é um padrão de plugins em C/C++ usado por Audacity, Ardour,
pedaleira MOD, etc.
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
Imagens feitas com a AudioLazyImagens feitas com a AudioLazy+ MatPlotLib+ MatPlotLib
+ hipsterplot+ hipsterplot
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy + Matplotlib + “hipsterplot”
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
PolinômiosPolinômios● Baseados em dicionárioBaseados em dicionário
– MemóriaMemória
– Expoente negativo (Laurent)Expoente negativo (Laurent)
– Expoente fracionário (soma de potências)Expoente fracionário (soma de potências)
– Variantes no tempoVariantes no tempo
● Objeto “x”Objeto “x”● InterpolaçãoInterpolação
– LagrangeLagrange
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 [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.5In [7]: (x + x ** 2 + x ** -.5)(4)Out[7]: 20.5
AudioLazy – Danilo J. S. Bellini – @danilobelliniAudioLazy – Danilo J. S. Bellini – @danilobelliniSETI / UFLA – 2014-10-27 – Lavras / MGSETI / UFLA – 2014-10-27 – Lavras / MG
Perguntas
Perguntas
?Obrigado!Obrigado!
https://github.com/dhttps://github.com/danilobellini/audiolazyanilobellini/audiolazy