Ir ao conteúdo
  • Cadastre-se
ribeiro220

Outro 12 frequências (notas musicais)

Posts recomendados

Boa tarde a todos!

É possível gerar 12 notas simultaneamente em algum microcontrolador (STM32,PIC,ARDUINO,ATMEL..?

Vi uma possibilidade em ter vários osciladores via software com a técnica DDS mas não consegui entender o real funcionamento.

Muito Grato.

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao googlar arduino dds achei bem interessante aquele (caro) módulo dds

...

 

Quase sinto vontade comprar. Mas pode ser que não te atenda pois pelo que vi superficialmente gera 2 sinais simultâneos. Sobre a técnica dds, li isso rapidinho

https://www.embarcados.com.br/dds-sintese-digital-direta/

e também quase não entendi muito.

Sobre gerar várias frequencias, vejamos o que vislumbro sem mc

2 74hc14 ou do gênero, 6 portas cada, cada uma com uma freq diferente

40106_just_osc1.png?w=800

Suas saídas somadas num ampl.

 

Obviamente com mc é mais desafiador. Sem pensar muito (e sem ler a teoria dds) vislumbro uma interrupt com uma dúzia de variáveis a controlar o momento da inversão de bits dos ports... Só posso falar isso... pode ser que ... ndv

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Isadora Ferraz disse:

Ao googlar arduino dds achei bem interessante aquele (caro) módulo dds

...

 

Quase sinto vontade comprar. Mas pode ser que não te atenda pois pelo que vi superficialmente gera 2 sinais simultâneos. Sobre a técnica dds, li isso rapidinho

https://www.embarcados.com.br/dds-sintese-digital-direta/

e também quase não entendi muito.

Sobre gerar várias frequencias, vejamos o que vislumbro sem mc

2 74hc14 ou do gênero, 6 portas cada, cada uma com uma freq diferente

40106_just_osc1.png?w=800

Suas saídas somadas num ampl.

 

Obviamente com mc é mais desafiador. Sem pensar muito (e sem ler a teoria dds) vislumbro uma interrupt com uma dúzia de variáveis a controlar o momento da inversão de bits dos ports... Só posso falar isso... pode ser que ... ndv

Boa noite e obrigado pela atenção,o problema em gerar frequencias individuais como o oscilador CI 40106 esta no fato de serem totalmente independente,ou seja se um oscilador sair de frequencia,a nota desafina.Se tiver um oscilador único,mesmo que o oscilador saia um pouco da frequencia,todas as outras acompanharão...

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
9 horas atrás, ribeiro220 disse:

CI 40106 esta no fato de serem totalmente independente,ou seja se um oscilador sair de frequencia,a nota desafina

Excelente observação. Mas era a opção minimalista 'pobre' e rápida que senti vontade registrar.

 

O que me fez lembrar dos 80's... Havia um computador apple ... algo como um TK2000 ... exatamente este...

450px-Spectrum_ED_Apple_II_compatible_co

anabolizado com disquete onde rodava um programa Electric Duet onde gerava 2 tons no a.f. Achava mó legal... como era possível?? Até fiz composições com ele

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ribeiro220 ,

 

São duas coisas diferentes ....

 

Por DDS você consegue sim gerar a frequência que quiser. Uma de cada vez ... e muito precisamente.

 

Mas sua pergunta é gerar as 12 frequências simultâneamente !  Isso não tem como !


Mas se for trabalhar com apenas duetos de frequências, aí sim dá para fazer no DDS, fazendo a soma algébrica do valor de saída ANTES de enviar para a saída. Para ter uma boa performance até 20 KHz isso teria de ser feito em Assembly, ou caso use um Arm de clock bem alto ( uns 150 Mhz no mínimo ) talvez possa ser feito em C mesmo.

 

Uma outra ideia é você utilizar 12 osciladores diferentes para gerar as frequências, e controlar as saídas deles , assim você tem todas as combinações possiveis... em um único volume...

 

Paulo

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 horas atrás, aphawk disse:

@ribeiro220 ,

 

São duas coisas diferentes ....

 

Por DDS você consegue sim gerar a frequência que quiser. Uma de cada vez ... e muito precisamente.

 

Mas sua pergunta é gerar as 12 frequências simultâneamente !  Isso não tem como !


Mas se for trabalhar com apenas duetos de frequências, aí sim dá para fazer no DDS, fazendo a soma algébrica do valor de saída ANTES de enviar para a saída. Para ter uma boa performance até 20 KHz isso teria de ser feito em Assembly, ou caso use um Arm de clock bem alto ( uns 150 Mhz no mínimo ) talvez possa ser feito em C mesmo.

 

Uma outra ideia é você utilizar 12 osciladores diferentes para gerar as frequências, e controlar as saídas deles , assim você tem todas as combinações possiveis... em um único volume...

 

Paulo

 

 

@aphawk  Muito obrigado pela atenção mas como seria essa soma algébrica?outra pergunta a ideia de controlar 12 osciladores não entendi muito bem!Desde já agradeço-lhe

Compartilhar este post


Link para o post
Compartilhar em outros sites
21 horas atrás, Isadora Ferraz disse:

2 74hc14 ou do gênero, 6 portas cada, cada uma com uma freq diferente

 

5 horas atrás, aphawk disse:

12 osciladores diferentes para gerar as frequências,

Qualquer coincidência é mera semelhança...

 

5 horas atrás, aphawk disse:

até 20 KHz isso teria de ser feito em Assembly, ou caso use um Arm de clock bem alto ( uns 150 Mhz no mínimo )

O Electric Duet rodava num 6502 a pouquíssimos Mhz que ainda controlava teclado, video e etc...

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Isadora Ferraz disse:

O Electric Duet rodava num 6502 a pouquíssimos Mhz que ainda controlava teclado, video e etc...

 

Pegue as possíveis combinações de 2 tons .... decomponha por Fourier, veja a forma matemática  desse sinal  e pronto !

Eu gostava muito do 6502 ..... é um Assembly bem legalzinho também ....

 

 

 

3 horas atrás, ribeiro220 disse:

 Muito obrigado pela atenção mas como seria essa soma algébrica?outra pergunta a ideia de controlar 12 osciladores não entendi muito bem!Desde já agradeço-lhe

 

Quando você gerar o sinal por DDS, a cada instante é gerado um cálculo a partir de uma tabela. Esse cálculo normalmente é um valor entre 0 e 255 que define a amplitude do sinal.

 

Se voce criar numa tabela essa forma de onda de duas frequências, de maneira que seja cíclica, basta usar o DDS comum e vai ter um resultado excelente.

 

Eu publiquei fazem alguns anos uma série de pequenos artigos sobre programar em Basic e Assembly para os Avrs ... está nos tópicos destacados do Fórum no tópico sobre Microcontroladores ..... alguns desses posts eram justamente sobre como gerar formas de ondas com grande precisão, e tinham alguns mostrando como funcionava o DDS ..... 

 

Paulo

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
17 minutos atrás, aphawk disse:

Pegue as possíveis combinações de 2 tons .... decomponha por Fourier, veja a forma matemática  desse sinal  e pronto !

Se foi pra me humilhar... conseguiu....😢

  • Curtir 1
  • Haha 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá... acho que dá pra fazer.

É o mesmo princípio que uso para fazer 12PWMs no ATtiny2313.

Precisará de uma base de tempo, digamos de 20uS para gerar, digamos, 50.000  interrupções por segundo(20uS). Pode usar um gerador externo ou um timer.

Criar 12 contadores(variáveis C1 a C12) para cada frequência a ser gerada, e 12 saídas: S1 a S12.

Suponhamos que queira a frequencia de 440Hz (nota Lá - bem conhecida dos músicos)

1/440~= 2272uS

Dividiremos por 2 para obter o semiciclo, ou 1136uS

Quantas interrupções são necessárias para este tempo: 1136uS/20uS~= 56.

Digamos que esta freq. é f1, então:

#define  f1    56

#define  f2    xx

.

.

#define  f12  xx

 

No tratamento da interrupção, fazer o seguinte.

void counter() {
 C1++; C2++; C3++;...  ; C12++;
 if (C1 == f1) {
   S1=!S1;  //inverte saída 1
   C1=0;     // reseta contador 1
 }
 if (C2 == f2) {
   S2=!S2;  //inverte saída 2
   C2=0;     // reseta contador 2
 }

//fazer isto para as 12 saídas
} //end interrupt

Não sei se fui claro! Se errei nos cálculos, me corrijam, pois fiz na pressa... mas a ideia é essa.

 

 

 

 

  • Curtir 2
  • Haha 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@xyko-2020  Muito obrigado pela atenção,ja pensei em fazer quase isso com um PIC em programar 12 contadores e ir decrementando a cada ciclo de máquina e sinceramente não me atentei a um timer ser a base.Vou tentar e darei retorno aqui.

tem varios projetos na internet mas parece que nada funciona,achei um interessante mas ao compilar dá um mote de erros.Conversei com o dono do projeto é um Russo que respondeu me abandonado o projeto a anos.

Vejam abaixo o que esse cara fez. Muito obrigado

 

http://www.pic24.ru/doku.php/en/osa/articles/pk2_osa_piano

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deve funcionar assim como meus 12 PWMs funcionam e uso há anos. Caso use um microcontrolador tipo STM32 a 72MHz, pode diminuir a base de tempo para que as frequencias fiquem bem mais precisas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@xyko-2020  12 pwm! isso é incrivel,seria uma ótima alternativa também,o link acima trabalha com saidas pwm.

Desculpe-me qual microcontrolador você usou ,se quiser mencionar é claro....

grato

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

ATtiny2313 @ 16 ou 20MHz. 

Compilador: Bascom AVR.

Nada impede que teste com arduino UNO ou NANO.

Indiquei um microcontrolador mais poderoso porque percebi que a IDE do arduino gera um código HEX muito maior que o BASCOM, portanto deve usar mais instruções para uma mesma função.

20uS é equivalente a 320 ciclos de máquina de um AVR, portanto acho que é o suficiente para tratar a interrupção, porém um STM32chega a 1.25 DMIPS / MHz.

 

These features make the STM32F103xx medium-density performance line microcontroller family suitable for a wide range of applications such as motor drives, application control, medical and handheld equipment, PC and gaming peripherals, GPS platforms, industrial applications, PLCs, inverters, printers, scanners, alarm systems, video intercoms, and HVACs.

Key Features

ARM® 32-bit Cortex® -M3 CPU Core

72 MHz maximum frequency,1.25 DMIPS/MHz (Dhrystone 2.1) performance at 0 wait state memory access

Single-cycle multiplication and hardware division

Referência

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Isadora Ferraz@aphawk@xyko-2020  tenho muito em agradecer-lhes por essas preciosas informações,na realidade quero fazer algo parecido,

 

mas primeiro tenho que ter as 12 notas musicais e depois fazer os devidos tratamentos nos sons gerados.Não tão aperfeiçoado igual ao video,mas que seja um bom som.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quero lembrar que no que propus a saída é onda quadrada. Para gerar onda senoidal o programa é bem mais complexo e dependendo da resolução do conversor DA usado, deve usar um uControlador bem mais poderoso, talvez até mesmo um DSP.

 

Estou desenvolvendo uma bateria eletrônica, tipo "DRUM PAD" com todos os instrumentos + alguns efeitos, isso usando um AVR normal, mas com algumas rotinas em assembly.

Defini que vai poder reproduzir até 4 instrumentos simultâneos, dos 32 que vou implementar,  usando conversores DA de 8bits ou os próprios PWMs e com 11025 "samples" por segundo. Não preciso de muita definição pois vou tocar só os sons graves. Assim que começar os testes coloco o vídeo aqui.

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Isadora Ferraz disse:

Se foi pra me humilhar... conseguiu....

 

KKKKKK eu apenas citei uma das maneiras possíveis, mas nem me lembro mais como fazia isso .... eu pessoalmente também usaria os 12 osciladores chaveador por CD4066 ....

 

30 minutos atrás, xyko-2020 disse:

20uS é equivalente a 320 ciclos de máquina de um AVR, portanto acho que é o suficiente para tratar a interrupção, porém um STM32chega a 1.25 DMIPS / MHz.

 

Jura que você também acreditou nisso ?

 

Generic STM32F103C8T6 72MHz (Cortex-M3)
INT_LOOP(30000) bench...= 2924 microseconds 10.26MIPS
LONG_LOOP(30000) bench...= 2926 microseconds 10.25MIPS
FLOAT_DIV(30000) bench...= 27979 microseconds 1.20MFLOPS
DOUBLE_DIV(30000) bench...= 38000 microseconds 0.86MFLOPS
FLOAT_MUL(30000) bench...= 20463 microseconds 1.71MFLOPS
DOUBLE_MUL(30000) bench...= 25891 microseconds 1.31MFLOPS

Arduino Nano (ATMega328 16MHz AVR)
INT_LOOP(30000) bench...= 7544 microseconds 3.98MIPS
LONG_LOOP(30000) bench...= 13408 microseconds 2.24MIPS
FLOAT_DIV(30000) bench...= 154792 microseconds 0.21MFLOPS
DOUBLE_DIV(30000) bench...= 154800 microseconds 0.21MFLOPS
FLOAT_MUL(30000) bench...= 156744 microseconds 0.21MFLOPS
DOUBLE_MUL(30000) bench...= 156736 microseconds 0.21MFLOPS

 

Repare os resultados do Atmega a 16 Mhz .... multiplique tudo por 4,5 , e compare com o STM32 .....

onde está a famosa "diferença dos 32 bits " e da estrutura ARM em relação aos velhos e idosos Atmegas ?

 

Me parece que fica bem claro que a única diferença é ter um clock maior kkkkkkkkkk

 

https://forum.arduino.cc/index.php?topic=431169.0

 

Complicado , meu amigo ...

 

Paulo

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
12 minutos atrás, aphawk disse:

pessoalmente também usaria os 12 osciladores chaveador por CD4066 ....

Já montei com 12 osciladores com 40106 o problema são os capacitores que sofrem alterações com mudança s climáticas quente ou frio e também pela estafa.isso vai variar mesmo que levemente a frequência da nota musical.A nossa audição percebe facilmente.grato

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ribeiro220 ,

 

Se esse é o problema ... faça 12 osciladores de precisão com 12 Atmegas kkkkkkk DDS fica super preciso...

 

Paulo

  • Haha 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 horas atrás, aphawk disse:

Jura que você também acreditou nisso ?

 

Acreditei quando fiz um teste só com "NOPs".

Fiz uma rotina na IDE do arduino onde medi os micros antes de executar milhares de instruções "NOP" e depois de executado "imprimi" a diferença no monitor. Cada NOP foi executado em 1/72MHz, ou 13.88nS.

Porém a diferença é gritante quando se testa ou se manipula 1bit. Por exemplo nos AVRs:

pinMode(10,OUTPUT);

a instrução acima consome dezenas de bytes da flash.

Já desta forma:

DDRB = DDRB || B00000100; // aqui parece que foi executado como em ASM.

apenas alguns bytes, portanto a IDE é que precisa ser otimizada.

 

 

 

 

adicionado 8 minutos depois

@ribeiro220

Acho que o problema da onda quadrada você pode resolver com isto.

Todas as saídas devem entrar num MIXER antes de ser amplificadas, senão as frequências mais baixas irão "encobrir" as mais altas.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 05/04/2020 às 19:43, Isadora Ferraz disse:

uma interrupt com uma dúzia de variáveis a controlar o momento da inversão de bits dos ports...

 

11 horas atrás, xyko-2020 disse:

Criar 12 contadores(variáveis C1 a C12) para cada frequência a ser gerada, e 12 saídas: S1 a S12.

Qualquer coincidência é outra mera semelhança. No entanto parece que o garoto quer mais que os bips irritantes da onda quadrada. Neste caso, pouco (ou melhor, nada) posso somar mas não sem antes corroborar a Chicão que "suaviza e torna menos irritante"

Square-to-sine-wave-converter-circuit.pn

... o som do circuito! 😉. Quem tiver um mínimo de sinestesia técnica (inventei isso agora) pode até "ouvir"

adicionado 7 minutos depois

Ah sim.. gostei do link do piano russo. . 👍 ... Até favoritei pra uso futuro..

abç

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Isadora Ferraz ,

 

Esse circuito dos três resistores e três capacitores .... a explicação dada no site original não está correta de jeito nenhum !

 

Por Fourier, uma onda quadrada nada mais é do que uma série de várias senóides , a fundamental e seus harmônicos.

 

Esse circuito é na verdade três filtros passa baixas em série, deixando passar a senóide na fundamental e diminuindo a amplitude dos harmônicos.

 

Quanto mais filtros colocar, melhor fica a forma de onda, isto é, mais pura a senóide fundamental.

 

Paulo

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

você é o cara... se falou, tá falado!

Mas não li a explicação do site. De um ponto de vista (ou ouvido sei lá) puramente prático, apenas consegui "sentir" a suavização das bordas quadradas no circuito acima - zero teoria. Quase dá pra "ver" o R&C amortecendo a transição, entende? 🙃🤔

Teria que ter um filtro deste pra cada tom...

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
20 horas atrás, aphawk disse:

@ribeiro220 ,

 

Se esse é o problema ... faça 12 osciladores de precisão com 12 Atmegas kkkkkkk DDS fica super preciso...

 

Paulo

@aphawk  Não compensa,custo beneficio..Conheço um desenvolvedor que fez tudo dentro de um Arm STMF32-051,polifonia com varias notas simultaneas e leitura dos teclados ate 61 teclas!usou técnicas de wavetables ou pcm.Um excelente trabalho,pena que ele não desenvolve pra pessoa fisica .ele trabalha pra uma empresa de órgãos eletronicos(teclado).

 

 

adicionado 7 minutos depois

 

 

 

adicionado 14 minutos depois
12 horas atrás, Isadora Ferraz disse:

 

Qualquer coincidência é outra mera semelhança. No entanto parece que o garoto quer mais que os bips irritantes da onda quadrada. Neste caso, pouco (ou melhor, nada) posso somar mas não sem antes corroborar a Chicão que "suaviza e torna menos irritante"

Square-to-sine-wave-converter-circuit.pn

... o som do circuito! 😉. Quem tiver um mínimo de sinestesia técnica (inventei isso agora) pode até "ouvir"

adicionado 7 minutos depois

Ah sim.. gostei do link do piano russo. . 👍 ... Até favoritei pra uso futuro..

abç

@Isadora Ferraz Boa noite,não quero os irritantes bips e sim a senoide,e seu circuito é mais ou menos isso que pretendo fazer mas na saida das notas tocadas juntas ou seja,no pré amplificador.Isso era muito usual nos circuitos antigos e dependendo do filtro voce consegue simular alguns instrumentos como flauta,oboé,piano,clarinete,...grato

adicionado 17 minutos depois
14 horas atrás, xyko-2020 disse:

adicionado 8 minutos depois

@ribeiro220

Acho que o problema da onda quadrada você pode resolver com isto.

Todas as saídas devem entrar num MIXER antes de ser amplificadas, senão as frequências mais baixas irão "encobrir" as mais altas.

Sim meu amigo,é isso mesmo .grato

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

53 minutos atrás, ribeiro220 disse:

 Não compensa,custo beneficio..Conheço um desenvolvedor que fez tudo dentro de um Arm STMF32-051,polifonia com varias notas simultaneas e leitura dos teclados ate 61 teclas!usou técnicas de wavetables ou pcm.Um excelente trabalho,pena que ele não desenvolve pra pessoa fisica .ele trabalha pra uma empresa de órgãos eletronicos(teclado).

 

Wavetable é fácil .. já PCM não é muito não ...

Veja se isto te ajuda :

 

 

 

A partir desse post tem outros interessantes, sobre DDS e alguns exemplos de wavetables.

 

Paulo

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Aprenda_a_Ler_Resistores_e_Capacitores-capa-3d-newsletter.jpg

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!