(2013-09-30) [pythonbrasil] síntese em tempo real com a audiolazy

Download (2013-09-30) [PythonBrasil] Síntese em tempo real com a AudioLazy

If you can't read please download the document

Upload: danilo-bellini

Post on 29-Jun-2015

124 views

Category:

Technology


7 download

DESCRIPTION

Slides do treinamento de 8 horas realizado na ESAF (Escola Fazendária, Brasília - DF) durante o PythonBrasil[9]. Segue abaixo a descrição do treinamento: A AudioLazy é um pacote escrito em puro Python que permite DSP (Digital Signal Processing) expressivo e em tempo real. Além dos fundamentos teóricos e uma explicação do funcionamento básico do pacote, serão vistos tanto na teoria como na prática diversos modelos de síntese: - AM - FM - Aditiva - Subtrativa Outros elementos de processamento do áudio serão vistos, tais como a utilização de filtros LTI e diferentes maneiras de distorcer o som sintetizado. Um dos desafios será a elaboração de um software que permita interatividade durante a síntese. Aqueles que forem participar com seu próprio computador, recomenda-se o uso de fones de ouvido. O pacote PyAudio é um requisito para a utilização dos componentes de I/O da AudioLazy. É recomendado que os pacotes já estejam instalados previamente.

TRANSCRIPT

  • 1. Sntese em tempo real com a AudioLazy http://pypi.python.org/pypi/audiolazy Copyright (C) 2012-2013 Danilo de Jesus da Silva Bellini [email protected] @danilobelliniBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini

2. Parte 0InstalaoBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 3. InstalandoAudioL apip install audiolazy pip install audiolazy # ou # ou easy_install audiolazy easy_install audiolazy # ou (em um diretrio apropriado) # ou (em um diretrio apropriado) wget -c https://pypi.python.org/packages/source/a/audiolazy/audiolazy-0.05.tar.gz wget -c https://pypi.python.org/packages/source/a/audiolazy/audiolazy-0.05.tar.gz tar xvzf audiolazy-0.05.tar.gz tar xvzf audiolazy-0.05.tar.gz python audiolazy-0.05/setup.py install python audiolazy-0.05/setup.py install # ou # ou git clone https://github.com/danilobellini/audiolazy git clone https://github.com/danilobellini/audiolazy cd audiolazy cd audiolazy pip install . pip install . # ou # ou pip install git+https://github.com/danilobellini/audiolazy pip install git+https://github.com/danilobellini/audiolazy PyAudio, NumPy, MatPlotLib, SciPy, wxPython (python-wxgtk2.8) Dependencias Pode instalar pelo apt-get, pacman, ...Music21 Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellinizy 4. Parte 1 SenidesGo go go! No, Python!Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 5. Antes da tecnologia digital... 1807 Thomas Young Vibroscpio1860 Leon Scott Fonoautgrafo1877 Charles Cros / Thomas Edison Parleofone (modelo) / Fongrafo (implementao e patente)1888 Emil Berliner Gramofone1939 John Cage Imaginary Landscape No. 11948 Musique concrtehttps://www.youtube.com/watch?v=CVN_mxVntXk2 vitrolas (velocidade varivel) c/ a gravao de uma frequncia, piano abafado e pratoPierre Schaeffer Etude aux Chemin de Fer 1951 Elektronische MusikUma das primeiras msicas eletroacsticas da histriaEstdio em Colnia Alemanha (NWDR Nordwestdeutscher Rundfunk) Braslia DF 8 horas de treinamentohttps://www.youtube.com/watch?v=N9pOq8Equipamento para gerao e processamento de sons. Permite compor diretamente na fita magntica. Herbert EimertCursos de vero em DarmstadtSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 6. Dcada de 1950 Sntese aditiva analgica Msica eletrnicaKarlheinz Stockhausen Opus 3 Para sntese aditiva [analgica]1953 Estudo I http://www.youtube.com/watch?v=5_NWwUB6Dis1954 Estudo II Nmero 5: Intervalo entre fundamental e quinto harmnico dividido em 25 alturas Proporo de frequncias: 5 25http://www.youtube.com/watch?v=hXqvBvOXV3UBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 7. Hello world em udio Tocar uma senide Console interativo from audiolazy import * from audiolazy import *Multith rerate = 44100 rate = 44100 s, Hz = sHz(rate) s, Hz = sHz(rate)ad!player = AudioIO() player = AudioIO() snd = sinusoid(440 * Hz).limit(2 * s) snd = sinusoid(440 * Hz).limit(2 * s) th = player.play(snd, rate=rate) # an AudioThread th = player.play(snd, rate=rate) # 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)Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 8. Notas/Alturas e MIDI Pitch Notas/alturas D = RE = MiF = FA = LB = SiMIDI Pitch str2freqCb4 (d bemol) a mesma nota que B3freq2strIgnoram a alteraostr2midiIniciam em dmidi2strOitavas Todas as combinaesG = SolC = Dmidi2freqfreq2midiDefine 69 como A4 (l central), deslocamento em semitonsBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 9. Exerccios #1 #4 1Sintetizar mais de uma senide em simultneo 2Dica: multiplicar cada senide por um nmero4stoppauseBraslia DF 8 horas de treinamentoSintetizar alm das senides gauss_noise saw_tableplayAlgo muda?Usar mtodos do objeto AudioThread ao invs do mtodo limit das senides (objetos Stream) Usar keyword arg phase, em radianosSoma de senides ou diferentes instncias de AudioThreadMudar a fase da senide Frequncias iguais e diferentes3white_noise[Extra #1] Tocar algo na escala do Estudo II de StockhausenSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 10. Parte 2 Stream!Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 11. Container para udio Tempo real Amostras (dados/elementos) inexistentes... ...em tempo de compilao (dados a serem coletados) ...em tempo de execuo (dados criados no futuro)Durao possivelmente indefinida (endless)No deve ser necessrio computar tudo para comear a apresentar o resultado Resultados parciais Para cada amostra de entrada, deve haver uma de sada Minimizar lag (atraso) entre entrada e sadaLaziness! Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 12. Classe Stream In [1]: from audiolazy import Stream In [1]: from audiolazy import Stream ItervelIn [2]: dados = Stream(5, 7, 1, 2, 5, 3, 2) # Peridico In [2]: dados = Stream(5, 7, 1, 2, 5, 3, 2) # PeridicoHeterogneoIn [3]: dados2 = Stream(0, 1) # Idem In [3]: dados2 = Stream(0, 1) # IdemAvaliao tardiaIn [4]: (dados + dados2).take(15) In [4]: (dados + dados2).take(15) Out[4]: [5, 8, 1, 3, 5, 4, 2, 6, 7, 2, 2, 6, 3, 3, 5] Out[4]: [5, 8, 1, 3, 5, 4, 2, 6, 7, 2, 2, 6, 3, 3, 5] Lembra geradoresOperadores Elementwise/broadcast como no NumPyJ estvamos usando (sinusoid)!Ausncia de ndices Limite de representao inteira (32 bits estouraria em 27:03:12)Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 13. Classe Stream Mtodos, atributos e propriedades so aplicados elemento a elemento Exceto quando existe na classe Stream (take, blocks, peek, skip, limit, ...)Finito ou de finalizao indeterminada In [5]: In [5]: Out[5]: Out[5]:Stream([2, 3, 4]).take(5) # Lista de entrada Stream([2, 3, 4]).take(5) # Lista de entrada [2, 3, 4] [2, 3, 4]In [6]: Stream(2, 3, 4).take(5) # Nmeros de entrada In [6]: Stream(2, 3, 4).take(5) # Nmeros de entrada Out[6]: [2, 3, 4, 2, 3] Out[6]: [2, 3, 4, 2, 3] In [7]: Stream(*[2, 3, 4]).take(5) # Lista com "*" In [7]: Stream(*[2, 3, 4]).take(5) # Lista com "*" Out[7]: [2, 3, 4, 2, 3] Out[7]: [2, 3, 4, 2, 3] In [8]: (2 * Stream([1 + 2j, -3j, 7]).real).take(inf) In [8]: (2 * Stream([1 + 2j, -3j, 7]).real).take(inf) Out[8]: [2.0, 0.0, 14] Out[8]: [2.0, 0.0, 14] Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 14. Decorador tostream: Geradores convertidos em Stream J foi aplicado a TODOS os itertools (e.g. count)!!!In [1]: from audiolazy import tostream In [1]: from audiolazy import tostream In [2]: @tostream In [2]: @tostream ...: def impulse(): ...: def impulse(): ...: yield 1 ...: yield 1 ...: while True: ...: while True: ...: yield 0 ...: yield 0 ...: ...: In [3]: In [3]: Out[3]: Out[3]:impulse # impulse # Sntese personalizada! (Acesso direto s amostras)In [4]: impulse() # Devolve um objeto Stream In [4]: impulse() # Devolve um objeto Stream Out[4]: Out[4]: In [5]: impulse().take(5) In [5]: impulse().take(5) Out[5]: [1, 0, 0, 0, 0] Out[5]: [1, 0, 0, 0, 0]In [6]: (impulse() + 1).take(5) # Outro objeto instanciado In [6]: (impulse() + 1).take(5) # Outro objeto instanciado Out[6]: [2, 1, 1, 1, 1] Out[6]: [2, 1, 1, 1, 1] Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 15. Music III Segregao de fluxos: Controle e dados Taxa de dados e taxa de controle Processamento em blocos Music 3 (origem), PureData, CSound, LADSPAContraste: funcionalidade strongly timed Sncrono Tamanho de bloco constanteChunKControlStream (AudioLazy) Property valuePermite interatividade Tempo realIn [2]: data.take(5) In [2]: data.take(5) Out[2]: [42, 42, 42, 42, 42] Out[2]: [42, 42, 42, 42, 42] In [3]: data.value = -1 In [3]: data.value = -1 In [4]: In [4]: Out[4]: Out[4]:data.take(5) data.take(5) [-1, -1, -1, -1, -1] [-1, -1, -1, -1, -1]Por amostraIn [1]: data = ControlStream(42) In [1]: data = ControlStream(42)Alterao do valor no sncronaBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 16. Exerccios #5 #6 5Controlar a senide (ou outra forma de onda) no shell em uma nica thread6Utilizar o teclado do computador como interface com o usurio Usar o getch do link http://code.activestate.com/recipes/134892/ (getch do C, readkey do Pascal) ou alguma biblioteca (curses, Tkinter, ...)[Extra] Associar o teclado QWERTY s alturas e simular a interface de um piano: asdfghjkl para C3 D3 E3 F3 G3 A3 B3 C4 D4 (teclas brancas)wetyuop para C#3 D#3 F#3 G#3 A#3 C#4 D#4 (teclas pretas)Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 17. Processamento em bloco Stream.blocks(size, hop) Qualquer salto (hop) positivoSe mudar a sada, a mudana persistir na prxima sada quando hop < size Sadas so a mesma fila circular implementada como collections.dequeIn [1]: data = Stream([1, 2, 3, 4, 5]) In [1]: data = Stream([1, 2, 3, 4, 5]) In [2]: blks = data.blocks(size=2, hop=1) In [2]: blks = data.blocks(size=2, hop=1) In [3]: [list(blk) for blk in blks] In [3]: [list(blk) for blk in blks] Out[3]: [[1, 2], [2, 3], [3, 4], [4, 5]] Out[3]: [[1, 2], [2, 3], [3, 4], [4, 5]] Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 18. Parte 3Sntese aditivaBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 19. Sntese digital 1951 CSIRAC (Australia) http://news.bbc.co.uk/2/hi/technology/7458479.stmDcada de 1960 Max Mattews (EUA) MUSICCompilar msica, lentoDcada de 1970 Viabilidade de realizar sntese digital em tempo realBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 20. Sntese aditiva Srie e Transformada de Fourier Uma funo contnua [por partes] pode ser decomposta em uma soma de senidesCusta caro (nmero de osciladores) Som harmnico: relao inteira entre as frequncias componentesBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 21. Envoltria/Envelope ADSR Attack DuraoSustain DuraoDecay from audiolazy import adsr, inf from audiolazy import adsr, inf import pylab import pylab env = adsr(100, a=5, d=3, s=.8, r=10).take(inf) env = adsr(100, a=5, d=3, s=.8, r=10).take(inf) pylab.plot(env) pylab.plot(env) pylab.show() pylab.show()IntensidadeRelease DuraoBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 22. Polinmios Necessrio para os filtros linearesBaseados em dicionrioIn [8]: In [8]: Out[8]: Out[8]:(x + x ** 2 + x ** -.5)(4) (x + x ** 2 + x ** -.5)(4) 20.5 20.5 Expoente negativo (Laurent) MemriaExpoente fracionrio (soma de potncias)Coeficientes podem ser objetos Stream, smbolos do SymPy, etc. 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^2Objeto xInterpolao (polinmios de Lagrange) Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 23. Exerccios #7 #8 78Sintetizar um som harmnico somando senides. A frequncia fundamental precisa estar presente? Utilizar a envoltria ADSR ao invs do mtodo Stream.limit [Extra] Usar ADS separado do R em uma interface com o usurio (e.g. eventos de mouse up/down).Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 24. Music IV Table Lookup Sons peridicos: armazenar um perodo do som Instncias de TableLookup sin_table saw_table Mtodo normalize Mtodo harmonize OperadoresConsulta tabela, com ndices fracionriosBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 25. Exerccio #9 Abrir o exemplo play_bach_choral.py e alterar o sintetizador para que seja utilizada onda quadrada Necessita do Music21Substituir ks_synth(freq) por uma funo que realize a sntese propostaOriginalmente esse exemplo utilizou o modelo digitar de Karplus-Strong, e trata-se de uma sntese subtrativa.Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 26. Parte 4Sntese por modulaoBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 27. Dcada de 1980 Ampliao da rea de sntese digitalNecessidade de reduzir os custos Sntese por modulao (AM, FM, RM) Sntese por filtragem (Subtrativa)1985 Surgimento da especificao MIDI Professor Guido Stolfi (Poli-USP) havia construdo um sintetizador com um protocolo de comunicao antes do MIDI existirBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 28. Modulao em amplitude e em anel Produto de sinaisRing Modulation Simetria entre ondas portadora e modulada Senide multiplica senideAM (Amplitude Modulation) Senide * (1 + Senide)Ring Modulation com portadora somada Assimetria entre ondas Faz diferena na percepo de frequncia Exerccio #10 AM e RM modulando rudo brancoBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobelliniImagem da Wikipedia 29. Modulao em frequncia FM (Frequency Modulation) Composio Senide(Senide) A frequncia uma senideEquivalente modulao em fase DerivadasYamaha DX7Sega Genesis / Mega DriveBraslia DF 8 horas de treinamentoImagem da WikipediaEx em mc plo fm .pySntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 30. Parte 5Filtros e sntese subtrativaBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 31. Filtros LTI (Lineares e invariantes no tempo) Digital signal processing is mainly based on linear time-invariant systems. systems. (Dutilleux, Dempwolf, Holters e Zlzer DAFx, segunda edio, captulo 4, p. 103) Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 32. Transformada Z Definio:Interpretao: Atraso em k amostras! Muitos infinitos Teoremas Possibilitam o uso prtico (eliminam os infinitos)Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 33. Exemplo de transformada Z AcumuladorMdia mvelSada / Entrada, ou H(z) = Y(z) / X(z) Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 34. 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^-1Filtros LTI, em geral:Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 35. Filtros prontos! Filtr Coe os va ficie rian pod ntes a tes no em se r e m d e t e m p o ! o b je tos S a * z ** -k trea m)Mdia mvelRessonadoresCombPassa-baixas e passa-altasGammatone (Patterson-Holdsworth, audio) SlaneyKlapuri 4 ressonadores em cascataImplementao genrica (qualquer ordem) Teoremas (parte de meu mestrado)Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 36. Plot (AudioLazy + MatPlotLib)! DTFT - Caso particular da transformada Z Mtodo plot dos filtros O valor de z est na circunferncia complexa unitria Resposta em frequnciaMtodo zplot Estabilidade do filtroXPlos: X Razes do denominadorZeros: O XRazes do numeradorBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobelliniMatPlotLib faz melhor que isto... 37. Consideraes finais sobre filtros Implementao direta I Evita multiplicao por 1 No cria os termos com coeficiente nuloJIT (Just in Time) Cada filtro criado e compilado em tempo de execuoPermite filtros variantes no tempo gerais e (at certo ponto) eficientesBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 38. Exerccios 1112Implementar a sequncia de Fibonacci como resposta ao impulso de um filtro digital Utilizando filtros ressonadores, criar um sintetizador de vozes subliminares com vogais. Utilizar a tabela do Wikipedia em ingls (artigo sobre formants)Valores recomendados para largura de banda: 400Hz (menor formante) 2kHz (maior formante)Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 39. Parte 6AnliseBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 40. Quantizao em ponto flutuante freq = 100 * Hz freq = 100 * Hz bw = erb(freq, Hz) * gammatone_erb_constants(4)[0] bw = erb(freq, Hz) * gammatone_erb_constants(4)[0] filt = gammatone.slaney(freq, bw) filt = gammatone.slaney(freq, bw) filt.plot(rate=rate, freq_scale="log", samples=8192).show() filt.plot(rate=rate, freq_scale="log", samples=8192).show()Sem CascadeFilterBraslia DF 8 horas de treinamentoCom CascadeFilterSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 41. Pitch Shepard Som de Shepard Subir sem parar Exemplo no GitHubDuas dimenses: Altura (pitch height) Dimenso linearCroma (pitch chroma) Dimenso circular Lembra Escher Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 42. Srie harmnica F0, 2F0, 3F0, 4F0 100 Hz, 200 Hz, 300 Hz...Inteiros? Racionais? Primos? 2+ oitavaComb!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) Braslia DF for freq in freqs) for freq in freqs) Sntese em tempo real com a AudioLazy 8 horas de 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() treinamento2013-09-30 Danilo J. S. Bellini @danilobellini 43. Envoltria espectral LPC - Predio LinearFormantes Pode ser utilizado para classificao 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 anlise Filtro de anlise alinhamento na visualizao com a DFT alinhamento na visualizao com a DFTBraslia DF # Filtro de sntese # Filtro de sntese Sntese em tempo real com a AudioLazy 8 horas de (G / filt).plot(blk=data, rate=rate, samples=1024, unwrap=False).show() (G / filt).plot(blk=data, rate=rate, samples=1024, unwrap=False).show() treinamento2013-09-30 Danilo J. S. Bellini @danilobellini 44. Parte 7FinalizaoBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 45. AudioLazy DSP (Digital Signal Processing) para udio Anlise MIR (Music Information Retrieval) Sntese ProcessamentoExpressividade de cdigo Tempo real (latncia de 35ms possvel) Facilita prototipao, simulao Possibilita uso em aplicaes finais100% Python MultiplataformaBraslia DF 8 horas de treinamentoSuporta Python 2 e 3 com o mesmo Sntese em tempo real com a AudioLazycdigo!2013-09-30 Danilo J. S. Bellini @danilobellini 46. Resultados cobertura de cdigo (Testes automatizados) --------------- 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 ----------------------------------------------------------------------------------------------------------------------__init__ 44 1 18 4 92% 72 Mock __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 174 7 78 9 94% 124, 136-138, 346, 471, 478 lazy_core 174 7 78 9 94% 124, 136-138, 346, 471, 478 lazy_filters 509 179 245 117 61% 55, 62, 83, 93, [...] lazy_filters 509 179 245 117 61% 55, 62, 83, 93, [...] lazy_io 156 43 58 28 67% 89, 141-157, 161, [...] lazy_io 156 43 58 28 67% 89, 141-157, 161, [...] lazy_itertools 37 12 20 13 56% 38, 59-60, 69-74, 100-103 lazy_itertools 37 12 20 13 56% 38, 59-60, 69-74, 100-103 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 184 2 124 3 98% 387-388 lazy_poly 184 2 124 3 98% 387-388 lazy_stream 175 2 76 4 98% 59, 738 lazy_stream 175 2 76 4 98% 59, 738 lazy_synth 243 32 118 39 80% 277-299, 428, 430, [...] lazy_synth 243 32 118 39 80% 277-299, 428, 430, [...] lazy_text 104 16 70 18 80% 133-148, 207, [...] lazy_text 104 16 70 18 80% 133-148, 207, [...] ----------------------------------------------------------------------------------------------------------------------TOTAL 2206 332 1045 258 82% TOTAL 2206 332 1045 258 82% ========================= 5938 passed in 29.00 seconds ========================= ========================= 5938 passed in 29.00 seconds ========================= Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 47. Testes com orculos 80 c/ o scipy.signal.lfilter64 c/ o subpacote de otimizao do SciPy2 c/ o NumPyimport pytest import pytest p = pytest.mark.parametrize p = pytest.mark.parametrize from scipy.signal import lfilter from scipy.signal import lfilter from audiolazy import ZFilter, almost_eq from audiolazy import ZFilter, almost_eq class TestZFilterScipy(object): class TestZFilterScipy(object): @p("a", [[1.], [3.], [1., 3.], [15., -17.2], [-18., 9.8, 0., 14.3]]) @p("a", [[1.], [3.], [1., 3.], [15., -17.2], [-18., 9.8, 0., 14.3]]) @p("b", [[1.], [-1.], [1., 0., -1.], [1., 3.]]) @p("b", [[1.], [-1.], [1., 0., -1.], [1., 3.]]) @p("data", [range(5), range(5, 0, -1), [7, 22, -5], [8., 3., 15.]]) @p("data", [range(5), range(5, 0, -1), [7, 22, -5], [8., 3., 15.]]) def test_lfilter(self, a, b, data): def test_lfilter(self, a, b, data): filt = ZFilter(b, a) # Cria um filtro com a AudioLazy filt = ZFilter(b, a) # Cria um filtro com a AudioLazy Braslia DF expected = de expected = lfilter(b, a, data).tolist()comAplica o filtro com o SciPy Sntese em tempo real # a AudioLazy 8 horas lfilter(b, a, data).tolist() # Aplica o filtro com o SciPy assert almost_eq(filt(data), expected)Bellini @danilobellini assert almost_eq(filt(data), expected) # Compara os resultados 2013-09-30 Danilo J. S. # Compara os resultados treinamento 48. Situao atual da AudioLazy Verso 0.05, ltima zero-zero Prxima verso (0.1) deve incluir Python 2 e 3! Filtros com expoentes inteiros variantes no tempo Sync para I/O (evita caching no Linux) Personalizao do AudioIO (dispositivo no padro) Otimizao para filtros combEmbora o MatPlotLib e o py.test sejam mais lento no Python 3, no o caso com a AudioLazy664 downloads realizados no ltimo ms (PyPI, valor coletado dia 2013-0930) Sintetizador, pedaleira e jogos em desenvolvimento utilizando ou planejando utilizar a AudioLazyBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 49. Possveis continuaes para o desenvolvimento da AudioLazy AnliseTestesChegar aos 100% Heursticas, MIR features Plugins (Vamp)Mock MatPlotLibModelagem audio Filtros Outros modelos (Lyon, Seneff, gamma chirp, etc.)Atrasos/expoentes variantes no tempo Converso entre x-dB e ERBSntese e processamento Escrita no tempoSymPyHost de plugins LADSPAFraes parciaisWah, phaser, eco, compressor, noise gate, Implementaes alternativasIntegrar com PureData, CSound, etc.I/OFlanger Karplus-Strong variante no tempoExemplos de uso da AudioLazy Trelia Forma direta IIOutrosMIDILogoEvitar cachingMelhorar a documentao (Sphinx)Integrar com PyGameOtimizaoBraslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini 50. Obrigado! O treinamento acabou, mas ainda h contedo a ser visto. Dvidas? Depoimentos? Comentrios? Fork me on GitHub https://github.com/danilobellini/audiolazy Braslia DF 8 horas de treinamentoSntese em tempo real com a AudioLazy 2013-09-30 Danilo J. S. Bellini @danilobellini