Pages: 1 [2] 3   Go Down
Author Topic: Geração de acorde  (Read 7871 times)
0 Members and 1 Guest are viewing this topic.
'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3247
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ...

Eu não disse que era simples. Gerar essas frequências com PWM é difícil, logo o melhor é começares a estudar timers e gerares tu o pwm. Já agora, dá uma vista de olhos sobre como não usar a digitalWrite() já que isso vai atrasar e muito o algoritmo.

Abraço e mete aqui o resultado.
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 - Então em teoria eu consegui entender como proceder e para gerar os acordes, fiz algumas interações em um fórum de  música onde participo também e peguei alguns detalhes técnicos, se quiser dar uma lida: http://forum.cifraclub.com.br/forum/9/294246/ .
Estou desenvolvendo o algorítimo, vou ver se faço ele de forma visual para conferir os resultados usando alguma linguagem que permita eu desenhar gráficos e depois tento portar a função para o arduino desenvolvendo a função para gerar meu pulso.
Legal a dica do "como não usar o  digitalWrite()", talvez eu esteja fazendo alguns erros em outros projetos por causa desse detalhe.

abraços ...
Logged


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

Já que estás numa de aprender coisas úteis... tens aqui como fazer o set, reset e toggle de bits em C.

http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c
http://nepsweb.co.uk/docs/bitTwiddle.pdf

Eu tenho umas macros algures nuns ficheiros de código... quando as descobrir posto aqui.

O segredo para a tua aplicação é perceber como fazer o timer disparar uma interrupção e alterar o estado do pino o mais rápido possível. Para isso tens de estudar como funcionam os timers e como fazer as contas para acertar a temporização. 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).

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

Você pode tentar dessa forma, como descrito pelo cara do seu post de fórum Cifrasclub, se quiser um acorde resultante da interferência de três senóides puras (uma senóide para cada nota do acorde, por exemplo):

Code:
#include <math.h>

#define PWMPERIOD 1.0/490.0
#define OMEGAC 2.0 * 3.14159 * 263.63
#define OMEGAE 2.0 * 3.14159 * 329.63
#define OMEGAG 2.0 * 3.14159 * 391.99

unsigned long time = 0;

void setup() {}

void loop() {
    double amplitude = 255.0 / 3.0 * (
        sin(OMEGAC * PWMPERIOD * time) +
        sin(OMEGAE * PWMPERIOD * time) +
        sin(OMEGAG * PWMPERIOD * time));

    analogWrite(3, (int)amplitude); // ligar o alto-falante no pino 3

    time++;
}
« Last Edit: September 18, 2012, 11:31:34 am by neuron_upheaval » Logged

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

neuron_upheava - Legal, acredito que seja por ai mesmo, preciso apenas de tempo para fazer os testes práticos, mas em teoria seria isso.

bubulindo - com certeza irei estudar ...

valeu pessoal
Logged


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

neuron_upheava

Aproveitei um tempo livre e dei uma olhada na sua fórmula, acredito que seja quase isso mas a amplitude deve ser calculada mais ou menos assim:

double amplitude = OMEGAC + OMEGAE * sin(2* time) + OMEGAG * sin(3* time) ;

Fiz o teste simulando valores no link abaixo:
http://ocw.mit.edu/ans7870/18/18.06/javademo/FourierSeries/

A periódica com essa fórmula que passou não retorna um agrupamento das frequências como visualizei em um editor de WAV gerando os tons e juntando as faixas, já usando esta fórmula ele desenha a periódica idêntica a somatória feita no editor WAV.

Neste link que eu passei da para simular os resultados.
Logged


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

Pessoal acho que cheguei a uma solução, ainda preciso acertar algumas coisas no projeto acertar a duração das notas, mas basicamente eu consegui misturar as frequências da seguinte forma.

void toca(int n1, int n2, int n3){
    for (int i=0;i<100;i++){
    digitalWrite(3,HIGH);
    delayMicroseconds(n1);
    digitalWrite(3,LOW); 
    delayMicroseconds(n1); 
    digitalWrite(3,HIGH);
    delayMicroseconds(n2);
    digitalWrite(3,LOW); 
    delayMicroseconds(n2); 
    digitalWrite(3,HIGH);
    delayMicroseconds(n3);
    digitalWrite(3,LOW); 
    delayMicroseconds(n3);
    }
}

void setup(){
 pinMode(3,OUTPUT);
}

void loop(){
  toca(1915,1519,1275);
  delay(100);
  toca(1915,1607,1275);
  delay(1000);
}

o 'n', a duracao do pulso pode ser calculado usando essa referência:
http://arduino.cc/playground/Portugues/LearningMelody

Teoricamente o programa gera um acorde 'Dó Maior' e um 'Dó Menor'
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

neuron_upheava
A periódica com essa fórmula que passou não retorna um agrupamento das frequências como visualizei em um editor de WAV gerando os tons e juntando as faixas, já usando esta fórmula ele desenha a periódica idêntica a somatória feita no editor WAV.
Você usou as frequências 263,63 Hz, 329,63 Hz e 391,99 Hz? Usou senóides em cada frequência e somou? Por que pegou o OMEGA de cada frequência e usou como amplitude? Sim, porque se multiplicar um valor à senóide, esse valor é a amplitude dela.

Para sua informação, uma senóide de amplitude A e frequência f é descrita matematicamente por A sen (2 pi f t)

E a interferência de várias senóides é dada pela soma algébrica delas

Esquece séries de Fourier por enquanto e volta para o começo da parte 2 do volume 2 do Tipler ou o capítulo 17 do Halliday, por favor
« Last Edit: September 19, 2012, 09:16:02 pm by neuron_upheaval » Logged

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

Por enquanto o mais próximo que cheguei:

#define   C   1897
#define   Ds   1607
#define   E   1517
#define   G   1276

void toca(int f1, int f2, int f3, int duracao){
duracao=duracao/10;
int i=0;
while (i<duracao){
digitalWrite(3,HIGH);
delayMicroseconds(f1/2);
digitalWrite(3,LOW);
delayMicroseconds(f1/2);
digitalWrite(3,HIGH);
delayMicroseconds(((f2+f1)/2)^2);
digitalWrite(3,LOW);
delayMicroseconds(((f2+f1)/2)^2);
digitalWrite(3,HIGH);
delayMicroseconds(((f3+f2)/2)^3);
digitalWrite(3,LOW);
delayMicroseconds(((f3+f2)/2)^3);
i++;
}
}

void setup(){
pinMode(3,OUTPUT);
Serial.begin(9600);
}

void loop(){
toca(C,E,G,1000);
toca(C,Ds,G,1000);
}

resultados:

Dó maior - http://flxsys.com.br/do_maior_arduino.mp3
Dó maior e dó menor - http://flxsys.com.br/arduino_teste.mp3
440Hz -referência - http://flxsys.com.br/la_arduino.mp3

esperado:
http://flxsys.com.br/do_maior_gerador.mp3
Logged


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

Eu tenho umas macros algures nuns ficheiros de código... quando as descobrir posto aqui.

Hoje tive tempo para brincar com o ATmega16... e descobri as tais macros.
Code:
#define SetB(PORT, BIT) ((PORT) |= 1<< (BIT))
#define ClrB(PORT, BIT) ((PORT) &= 1<< (BIT))
#define TogB(PORT, BIT) ((PORT) ^= 1<< (BIT))

Isto usa-se assim

Code:
SetB(PORTA, 0); //coloca o bit 0 do porto A a 1

ClrB(PORTB, 3); //coloca o bit 3 do porto B a 0
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

Hum, legal, vamos ver se entendi ... você define que as as portas irão usar um determinado timmer?
Mas ainda estou perdido ... sobre como usar
Logged


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

Desculpa... não expliquei.

Estas macros servem apenas para alterar o estado dum pino. Os timers é algo completamente diferente. No entanto, com estas macros, alterar o estado do pino é muito mais rápido que usar o digitalWrite(). O ponto fraco é que tens de saber usar e configurar os portos e não podes usar os números do Arduino.

Ahh, podes usar isto em variáveis também.
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

Interessante, sou iniciante ainda no Arduino, você teria algum tutorial sobre isso?
Quando você diz alterar o estado seria a forma com o pino troca a informação?
Logged


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

muda de estado = muda de high para low ou de low para high.
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

Opa bubulindo, agora eu entendi, mas ainda acho que estou longe de chegar neste ponto, ainda.
Minha dificuldade maior está sendo gerar a onda no formato da imagem que disponibilizei,



Essa imagem é o resultado da somatória das ondas quadradas que formam um acorde Dó maior.
basicamente teria que simular isso no Arduino para gerar um acorde, já que ele trabalha com ondas quadradas.

Nos meus experimentos antigos eu estava tentando usar ondas senoidais =o)

Logged


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