Ir ao conteúdo
  • Cadastre-se

Outro 12 frequências (notas musicais)


Posts recomendados

Boa tarde a todos,vejam isso,graças a vocês e A DEUS fiz algo baseado no conceito do nosso amigo @xyko-2020 ,porém não usei base de tempo como o timer0 do Pic pois não consegui(fica pra próxima).Escrevi e compilei e no MikroC e simulei no Proteus.Não ficaram exatas as medidas mas tocando não dá pra perceber.

PIC16F628 - 20MHZ,gostaria de enviar o arquivo do proteus mas não consigo por aqui.

int c0 = 0x00;                  //Variável de contagem auxiliar
int c1 =0x00;
int c2 = 0x00;                  //Variável de contagem auxiliar
int c3 =0x00;
int c4 = 0x00;                  //Variável de contagem auxiliar
int c5 =0x00;
int c6 = 0x00;                  //Variável de contagem auxiliar
int c7 =0x00;
int c8 = 0x00;                  //Variável de contagem auxiliar
int c9 =0x00;
int c10 = 0x00;                  //Variável de contagem auxiliar
int c11 =0x00;

void main()                    // configura port.a e port.bcomo saidas digitais
{  TRISA.RA0 = 0X00;
   RA0_bit   = 0x00;
   
   TRISA.RA1 = 0X00;
   RA1_bit   = 0x00;
   
   TRISA.RA2 = 0X00;
   RA2_bit   = 0x00;

   TRISA.RA3 = 0X00;
   RA3_bit   = 0x00;

   TRISB.RB0  = 0x00;
   RB0_bit    = 0x00;
   TRISB.RB1  = 0x00;
   RB1_bit    = 0x00;
   
   TRISB.RB2  = 0x00;
   RB2_bit    = 0x00;
   TRISB.RB3 = 0x00;
   RB3_bit    = 0x00;
   
   TRISB.RB4  = 0x00;
   RB4_bit    = 0x00;
   TRISB.RB5  = 0x00;
   RB5_bit    = 0x00;

   TRISB.RB6  = 0x00;
   RB6_bit    = 0x00;
   TRISB.RB7 = 0x00;
   RB7_bit    = 0x00;
   

while(1)
   {    c0++;                  //incrementa contadores
        c1++;
        c2++;
        c3++;
        c4++;
        c5++;
        c6++;
        c7++;
        c8++;
        c9++;
        c10++;
        c11++;

       if(c0==65)               // compara e se for igual executa
       {

          RA0_bit = ~RA0_bit;
          c0 = 0x00;
       }
         if(c1==61)
       {
          RA1_bit = ~RA1_bit;
          c1 = 0x00;
       }

       if(c2==58)
       {
          RA2_bit = ~RA2_bit;
          c2 = 0x00;
       }
         if(c3==55)
        
          {

          RA3_bit = ~RA3_bit;
          c3 = 0x00;
       }
        
        
        

       if(c4==52)
       {

          RB0_bit = ~RB0_bit;
          c4 = 0x00;
       }
         if(c5==49)
       {
          RB1_bit = ~RB1_bit;
          c5 = 0x00;
       }
       
       if(c6==46)
       {
          RB2_bit = ~RB2_bit;
          c6 = 0x00;
       }
         if(c7==43)
       {

          RB3_bit = ~RB3_bit;
          c7 = 0x00;
       }
       
         if(c8==41)
       {

          RB4_bit = ~RB4_bit;
          c8 = 0x00;
       }
         if(c9==39)
       {

          RB5_bit = ~RB5_bit;
          c9= 0x00;
       }

       if(c10==37)
       {
          RB6_bit = ~RB6_bit;
          c10 = 0x00;
       }
         if(c11==35)
       {

          RB7_bit = ~RB7_bit;
          c11 = 0x00;
       }

       
       
       
   } //end while

} //end main

image.png.7778b25064cf584f7d94a7e1b6216e2d.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@ribeiro220 ,

 

Um excelente bom começo ! Parabéns !

 

O problema é que você não tem uma base de tempo para poder ver exatamente  o tempo decorrido, independente dos tempos de execução das instruções do seu programa. Isso se resolve criando uma base de tempo por interrupção, mas seria necessário um processador de muito grande velocidade para ter uma resolução de 1 Hz nas frequências ( até 20 Khz ) baseado em um contador de Timer .... ou seja, a diferença de tempo do período de 20.000 hz para 19.999 Hz equivale a um único ciclo de clock da frequência de 400 Mhz aproximadamente ! 

 

Para se ter essa resolução toda, só mesmo gerando com um DDS ...

 

Continue com suas experiências!

 

Paulo

 

 

 

Link para o comentário
Compartilhar em outros sites

@aphawk Muito obrigado amigo.Vou tentar com interrupção do Timer do Pic e conseguindo,posto aqui.Gostaria de enviar _lhes o circuito pronto no Proteus pra escutar em os sons.Toca todas notas simultâneamente.polifonia de 12  notas.Muito obrigado e se puderem me ajudar eu sempre serei grato.Meu código é muito simples pois não sei como otimizar o mesmo.

Link para o comentário
Compartilhar em outros sites

@ribeiro220,

 

Tranquilo, meu amigo.

 

voce vai usar um Timer de 16 bits com esse Pic, tente gerar apenas frequências baixas, no máximo 500 Hz mesmo.

 

Por exemplo, 250 Hertz e 280 Hertz tem períodos de 0,004 e 0,00357 segundos.

A diferença entre eles é de 0,00043 segundos, certo ?

 

Essa é a resolução necessária de seu timer, e supondo que esse seja o período entre duas interrupções, a frequência de interrupções do seu Timer tem de ser de 1 / 0,00043 = 2,325 Khz. Veja bem, isso para poder gerar duas frequências BAIXAS, afastadas ente si de 30 Hz, que é cerca de 12% de magnitude.

 

Não esqueça que na verdade você tem de DOBRAR essa resolução na prática, pois você tem de levar o sinal de saída para nível 0 e depois para nível 1, e finalmente para 0, para simular a onda quadrada. Tem de gerar dois níveis durante o período correspondente à frequência de sua onda a ser gerada.

 

 

Só para te dar um exemplo pior, imagine que você quer gerar 500 Hz e 525 Hz. Fazendo o mesmo calculo, você chega em 0,000095 segundos de diferença . A frequência de interrupção necessária para essa resolução seria de 10,526 Khz. , para uma magnitude de diferença de 5%.

 

Quanto mais você sobe a frequência a ser gerada, e quanto menor é a diferença entre as frequências, a frequência das interrupções sobe muito, impossibilitando a sua utilização.

 

Gerar uma interrupção a cada 100 nano segundos permite que você consiga gerar as frequências abaixo de 500 Hz com um espaçamento legal entre elas, algo que acredito que seja parecido com as que você fez em seu programa.

 

Mas para um Pic que mesmo a 20 Mhz equivale a um Avr a 5 Mhz , e ainda mais programando em linguagem de alto nível, vai ser bem complicado de fazer.

 

Eu sugiro que você faça o seu primeiro programa gerando as interrupções a cada 1 milissegundo, implemente o contador, lembre do que falei de dobrar a resolução para gerar a onda quadrada,  e no loop principal fora da interrupção você verifica as contagens para gerar as suas notas.

 

Quando conseguir isso, tente com as interrupções a cada 0,1 milissegundos e veja o que consegue ok ?

 

Paulo

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Em 05/04/2020 às 19:43, Isadora Ferraz disse:

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

você não lançou mão do uso da interrupt que de fato tem que ser rápida. Veja outra opção talvez (talvez) otimizada pra 1 variável só, só no loop, sem interrupt mesmo...

#define d_o RB0_bit
#define re RB1_bit
#define mi RB2_bit
//#define nota RX_bitx

for(;;)

{
c++;
if (!(c%65)) d_o^=1;
if (!(c%61)) re^=1;
if (!(c%58)) mi^=1;
//...
if (!(c%x)) nota^=1;
if (c>maior_valor) c=0;
}

Também pode controlar o momento da inversão...

De novo, digito online sem testar, claro...

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 2 meses depois...

Na verdade é possível gerar muitas notas musicais simultaneamente. 

Quer seja por leitura de uma tabela de ondas ou por cálculos matemáticos,  sendo nesse caso o mais produtivo usar um DSP.

Em relação ao uso de MCUs quanto maior o clock maior o número de notas geradas simultaneamente. 

O uso de técnicas DDS é fundamental. 

A geração de timbres contidos em tabelas de ondas pode ser de duas categorias mais conhecidas, wave ou pcm.     A técnica com base em wavetable utiliza uma unica amostra para gerar todas as notas musicais.    Ja a tecnica PCM consta também do mesmo tipo de amostra wave porém se é gerado uma onda para cada nota musical, isso atribui uma relação de qualidade absoluta, ao contrário do metodo wave que produz distorção acima ou abaixo da frequência base de amostragem.

Em um MCU pic18 se consegue gerar uma senoide de 16bits com até uns 5 ou 7 canais de polifonia.

 

A questão do fw ser escrito em C ou ASM indifere no resultado final.     Tudo vai depender do algoritmo criado.

 

Ja vi um mcu8051 tocando 8 canais de polifina com base em wavetable.     Orgao lourey da decada de 80.

  • Curtir 3
Link para o comentário
Compartilhar em outros sites

@Guri Vonnilmam DEUS TE ABENÇOE meu amigo,mas estou batendo em ponta de faca e só decepcionando comigo mesmo.

Parece que a mente está fechada,informações tem de todos os lados e com certeza estão corretas,o problema é meu entendimento no assunto.

esse negócio de fazer varios osciladores internos trabalhando em conjunto como fosse uma orquestra não é pra qualquer um não.Vejo códigos prontos que só fala em gerar uma senóide,quando fala em polifonia,ai o calo aperta.

Ja tentei comprar projeto pronto de freelancer,mas não entendem de sinteses musicais,trabalham mais com automaçao.

sem falar dos efeitos posteriormente de sustain,vibrato,etc.

Estou igual a Moisés no egito,vou ver a terra de longe mas não vou chegar lá ou seja vejo brilhantes projetos mas só fica nisso.

DEUS TE ABENÇOE

Acho que conheço você de algum lugar!

veja isso

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Não é bem assim Ribeiro.     Não se desvalorize!      O conceito prático sobre sinteze sonora é algo complexo e demanda muita dedicação de fato.     Os conceitos envolvidos são realmente complexos.

Imagine uma base de tempo padrão,  fixa à 22050hz.     Essa base de tempo poderia estar num timer do pic18 por exemplo, sendo ativada na interrupção.     Assim a cada 1÷22050 lhe dará um time total entre uma interrupção e outra uns 45us.      Dentro desse time você inclui seus osciladores quantos der dentro desse time, lembre de deixar uma folga para o retorno e execução do main.

Eu fiz um bateria que toca 8 instrumentos simultaneamente com resolução de 16bits e sample de 22050hz o som é HI-FI. ...em um pic18f4520...como a memoria era pouca, reajustei as amostras ao minimo possível. ..e ainda deu para por controle de volume master: 

 

Em um dsp da texas com core arm tipo a linha tms320...é possível gerar 384 canais de polifonia,  isso da para gerar 9 drawbars lower e upper mais pedals bass com 4 vozes mono.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

14 horas atrás, Guri Vonnilmam disse:

Não é bem assim Ribeiro.     Não se desvalorize!      O conceito prático sobre sinteze sonora é algo complexo e demanda muita dedicação de fato.     Os conceitos envolvidos são realmente complexos.

Imagine uma base de tempo padrão,  fixa à 22050hz.     Essa base de tempo poderia estar num timer do pic18 por exemplo, sendo ativada na interrupção.     Assim a cada 1÷22050 lhe dará um time total entre uma interrupção e outra uns 45us.      Dentro desse time você inclui seus osciladores quantos der dentro desse time, lembre de deixar uma folga para o retorno e execução do main.

Eu fiz um bateria que toca 8 instrumentos simultaneamente com resolução de 16bits e sample de 22050hz o som é HI-FI. ...em um pic18f4520...como a memoria era pouca, reajustei as amostras ao minimo possível. ..e ainda deu para por controle de volume master: 

 

Em um dsp da texas com core arm tipo a linha tms320...é possível gerar 384 canais de polifonia,  isso da para gerar 9 drawbars lower e upper mais pedals bass com 4 vozes mono.

@Guri Vonnilmam DEUS O ABENÇOE MUITO!

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!