Pages: [1] 2 3   Go Down
Author Topic: Geração de acorde  (Read 7932 times)
0 Members and 1 Guest are viewing this topic.
Araraquara
Offline Offline
Jr. Member
**
Karma: 0
Posts: 51
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá,

   Sou iniciante e essa é minha primeira participação no fórum, espero que minha dúvida não seja muito básica.

   Estes dias estou fazendo testes com a função tone no arduino, para gerar uma nota é simples, contudo eu queria tentar gerar um acorde, ou seja duas ou mais notas ao mesmo tempo.
   Estou fazendo testes com o Arduino UNO, mas ao ligar o segundo autofalante ou qualquer coisa que faça ruído e pedir para gerar o som nos dois ao mesmo tempo a placa não o faz, gera apenas o primeiro ruído.
   Vi que esse problema ocorre se usar as portas PWM com leds e autofalantes também.
   Agora a pergunta, onde errei?
Logged


BHZ, MG, Brazil
Offline Offline
Sr. Member
****
Karma: 10
Posts: 346
Android developer; Arduino enthusiast
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Já tentou usar uma das portas digitais, ao invés das portas PWM ?

Eu tive algum sucesso ligando 3 speakers simultaneamente no Arduino Mega2560, usando as portas digitais.
Logged

Learn to live: Live to learn.
Showing off my work: http://arduino.cc/forum/index.php/topic,126197.0.html

Brasil
Offline Offline
Sr. Member
****
Karma: 2
Posts: 315
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Não sou musico, mas acho o seguinte.
Quando você tem um alto-falante, esse recebe apenas 1 sinal, mas você consegue perceber que são vários instrumentos tocando ao mesmo tempo, a "onda sonora" que ele gera é uma só, talvez o que tenhas que fazer é
"unir" os dois tons como um só, não tentando fazer duas saídas independentes.
Logged

4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP


Araraquara
Offline Offline
Jr. Member
**
Karma: 0
Posts: 51
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu pensei nisso, em achar uma media entre as frequêcias e gerar uma única nota, mas a sonoridade é diferente, quando você toca um acorde consegue identificar as notas contidas nele. A única forma é tocando mesmo em dois ou mais, uma frequência única não dá esse efeito.

Eu tentei em todas as portas, não consegui. Será que não é uma limitação do hardware? O processador não consegue pensar em todas as informações juntas no Arduino UNO e privilegia a primeira saida utilizada?
Logged


BHZ, MG, Brazil
Offline Offline
Sr. Member
****
Karma: 10
Posts: 346
Android developer; Arduino enthusiast
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

spiderpoison, a princípio, o Arduino consegue emitir mais de um tom simultaneamente em mais de um speaker (vamos chamá-los de canais).

Tem um sketch nos exemplos que faz isto (não lembro agora pois não tenho a IDE nesta máquina). Já tentou rodar o sketch-exemplos de multi-tons ?
Logged

Learn to live: Live to learn.
Showing off my work: http://arduino.cc/forum/index.php/topic,126197.0.html

Araraquara
Offline Offline
Jr. Member
**
Karma: 0
Posts: 51
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ola, eu dei uma olhada no exemplo que está lá.
No exemplo é utilizado 3 canais, contudo ele para um canal antes de tocar outro, da uma olhada no fonte.

void loop() {
   noTone(11);         
  tone(6, 440, 200);
  delay(200);
  noTone(6);
  tone(7, 494, 500);
  delay(500);
  noTone(7); 
  tone(11, 523, 300);
  delay(300);
}
Logged


central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Faz o que o AlxDroidDev falou: ligue mais de um alto-falante no Arduino e gere, em cada um deles, um tom. Se as caixas estiverem dispostas de forma adequada, acontecerá a interferência dos tons gerados em cada um deles e daí você vai ter, no final, o acorde que quer.

Acordes no violão, pelo que sei, precisam de dois, três ou quatro notas musicais simultâneas. Para cada nota você precisará de um alto-falante.
Logged

Araraquara
Offline Offline
Jr. Member
**
Karma: 0
Posts: 51
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Olá, a ideia é justamente essa, gerar uma nota em cada auto-falante simultaneamente, e juntas, estas formariam um acorde, mas pelo que pesquisei o Arduíno UNO só consegue gerar uma frequência por vez e não em todos os auto-falantes juntos.

O trecho do código que postei é justamente do exemplo citado pelo AlxDroidDev, e no final do exemplo tem a observação que só é possível gerar uma nota por vez e não notas simultâneas.

É possível formar acordes a partir de 2 notas, exemplo: Dó, Sol (Dó maior) ou com mais Dó, Ré#, Sol (Dó menor)e por ai vai. As regras de formação de acorde são simples.

Uma outra coisa que notei é que se você usa uma porta PWM e um auto-falante, pode gerar interferência inibindo a produção de som em alguns casos, em um teste usando led RGB, controle remoto e um piezo, fiquei extremamente frustrado.
Logged


central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Então não use o tone(), faça o seu próprio código gerar três tons simultâneos:
Code:

unsigned long firstC = 0;
unsigned long E = 0;
unsigned long secondC = 0;

int firstCState = HIGH;
int EState = HIGH;
int secondCState = HIGH;

void generateTones() {
    if (millis() - firstC > 15) {
        firstC = millis();
        firstCState = firstCState == HIGH? LOW : HIGH;
        digitalWrite(7, firstCState);
    }

    if (millis() - E > 12) {
        E = millis();
        EState = EState == HIGH? LOW ? HIGH;
        digitalWrite(8, EState);

    if (millis() - secondC > 7) {
        secondC = millis();
        secondCState = secondCState == HIGH? LOW : HIGH;
        digitalWrite(9, secondCState);
    }
}

void setup {
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
}

void loop {
    generateTones();
}
« Last Edit: September 13, 2012, 07:27:46 pm by neuron_upheaval » Logged

Araraquara
Offline Offline
Jr. Member
**
Karma: 0
Posts: 51
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Opa eu também já testei, não funciona. Deve ser mesmo uma limitação de hardware pois no próprio exemplo do multitone diz que não é possível tocar mais de uma nota ao mesmo tempo.
Depois de ver o depoimento do AlxDroidDev, acredito que seja possível fazer apenas no MEGA2560 pois ele deve ter uma capacidade de processamento maior para conseguir gerar mais de um tom ao mesmo tempo.

Logged


'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3255
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Se não funciona no ATmega328, porque achas que um processador igual a correr à mesma frequência vai fazer melhor? Importas-te de explicar?

Em princípio deves saber de música, mas que é que sabes de coisas como Séries de Fourier? Como tu disseste são duas notas ao mesmo tempo... logo são duas frequências distintas... se vires a série de fourier talvez percebas o que se passa com um acorde e como gerá-lo. Aviso já que não é simples.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Araraquara
Offline Offline
Jr. Member
**
Karma: 0
Posts: 51
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Eu precisaria entender como o Arduino usa as postas PWM para fazer os cálculos e gerar as frequências para te dar esta resposta, em teoria eu acredito que a outra placa deva ter um controle melhor dos recursos por ter mais portas PWM. Tirei esta conclusão por observação ao ver que funciona no Mega.

Irei dar uma estudada na Séries de Fourier, valew ...
Logged


'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3255
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Lá está... e se reparares, consegues gerar vários sinais PWM com as portas do ATmega328... suficientes, diria eu para gerar um acorde. Logo, apesar de conseguires mais "tons" no mega2560, o mega328 também serve para provar o que pretendes.

Experimenta ver como funcionam os timers e saídas de PWM e vais chegar lá. smiley
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Araraquara
Offline Offline
Jr. Member
**
Karma: 0
Posts: 51
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

bubulindo

http://arduino.cc/en/Tutorial/Tone4

"The tone() command works by taking over one of the Atmega's internal timers, setting it to the frequency you want, and using the timer to pulse an output pin. Since it's only using one timer, you can only play one note at a time."

Pesquisei sobre a Séries de Fourier, vi que ela é usada apenas para definir o intervalo harmônico de acordes, ela foi utilizada para classificar as notas.

O que preciso no caso, como o Arduino não toca mais de uma nota ao mesmo tempo é saber se há alguma forma de calcular a frequência de um determinado acorde, exemplo:

Dó =  263.63 Hz
Mi =  329.63 Hz
Sol = 391.99 Hz

Queria saber se é possível algo do tipo

Dó maior = (Dó+Mi+Sol)/3

Só que no caso da 329 Hz, um mi desafinado

Vou ver o que acho, se achar uma solução posto por ai.


Logged


Araraquara
Offline Offline
Jr. Member
**
Karma: 0
Posts: 51
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Em princípio deves saber de música, mas que é que sabes de coisas como Séries de Fourier? Como tu disseste são duas notas ao mesmo tempo... logo são duas frequências distintas... se vires a série de fourier talvez percebas o que se passa com um acorde e como gerá-lo. Aviso já que não é simples.

Rapaz, depois de passar o resto do dia estudando eu consegui entender que a Serie de Fourier não só foi o que definiu a classificação dos acordes como também tem a resposta para criar o encapsulamento de frequências.
Fiz um teste usando o Audacity, ele tem um gerador de tom, gerei duas notas e combinei as frequências ai pude compreender o que acontece com a onda.
Em teoria pode ser reproduzido através de algum algorítimo tenebroso pelo que notei, vamos ver se eu consigo desenvolver, afinal tenho que ter uma distração ...

Se tiver novidades eu posto aqui ...
Logged


Pages: [1] 2 3   Go Up
Jump to: