Go Down

Topic: Geração de acorde (Read 8 times) previous topic - next topic

spiderpoison

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.

spiderpoison

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'

neuron_upheaval

#22
Sep 20, 2012, 03:31 am Last Edit: Sep 20, 2012, 04:16 am by neuron_upheaval Reason: 1

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 [font=Courier]A sen (2 pi f t)[/font]

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

spiderpoison

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

bubulindo


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: [Select]

#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: [Select]

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

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

Go Up