Melodía

music-score-notes
[Public Domain]

Descrición:

Imos facer que un altofalante conectado nunha saída dixital emita unha melodía

Programas:

1. Melodía programada

  • Creamos unha variable para detectar o estado do pulsador
  • Utilizamos a función tone(pin,frecuencia,duración) para definir o son
// Declaración de variables:

const int pulsador=2;       // Definimos o pulsador no pin 2
const int altofalante=4;    // Definimos o altofalante no pin 4
int estado=0;               //Inicialmente o estado do pulsador é 0 (desactivado)

// Configuración:

void setup(){
  pinMode(4,OUTPUT);   // Configuramos o pin 4 como saída
}

// Programa:

void loop(){

  estado = digitalRead(pulsador);
  if(estado==HIGH){
    tone(4,1000,200);      // 1000 Hz durante 0.2s
    delay(400);            // Agarda 0.4s
    tone(4,1500,300);      // 1500 Hz durante 0.3s
    delay(400);            // Agarda 0.4s
    tone(4,2000,500);      // 2000 Hz durante 0.5s
  }

}

1. Melodía con arrays

Outra maneira de definir unha melodía é definindo ao principio dous arrays, un coas frecuencias das notas que queremos que soen e outro cos tempos de duración de cada nota. Despois imos percorrendo os arrays mediante unha función for.

// Declaración de variables:

int melodia[] = {262, 196, 196, 220, 196,0, 247, 262};  // Array de notas
int tempos[] = {4, 8, 8, 4, 4, 4, 4, 4};                // Array de tempos (cuarta, oitava, etc.)

const int zumbador = 4; 
const int pulsador=2;

// Configuración:
  
void setup() {
  pinMode(zumbador, OUTPUT); 
}

// Programa

void loop() {

  int estado = digitalRead(pulsador);           // comeza a melodía ao premer no pulsador
  if(estado==HIGH){
    
    for (int nota = 0; nota < 8; nota++) {      // Imos percorrendo os arrays de 0 a 7
      int duracion = 1000/tempos[nota];         // calculamos o tempo de duración de cada nota en ms
      tone(zumbador, melodia[nota], duracion);  // Soa a nota correspondente
      int pausaNota = duracion * 1.30;           // Deixa de soar a nota
      delay(pausaNota);
      noTone(zumbador);    
    }
    
  }
 
}

3. Piano

Agora imos utilizar os pulsadores como se fosen teclas dun piano. Cada vez que prememos nun pulsador soa a nota correspondente mentres estea activado e deixa de soar cando soltamos.

  • Para executar o son mentres estamos premendo utilizamos a función  while(condición){ proceso }
  • Non imos marcar un tempo predeterminado, pois a nota soará mentres esteamos premendo, así que usaremos as funcións tone(pin, frecuencia); e noTone(pin);

Ímolo programar para tres notas, DO, RE e MI.  Necesitaremos conectar tres pulsadores, un para cada nota. Se queres facer a escala completa non tes máis que conectar 7 pulsadores e engadir as notas que faltan.

// Declaración de variables

const int zumbador = 11;  // zumbador no pin 11

const int doPin =2;       // Pins dos pulsadores
const int rePin =3;
const int miPin =4;

const int DO  = 262;      // Frecuencias das notas mulicais
const int RE  = 294;
const int MI  = 330;


// Configuración

void setup(){
  pinMode(zumbador, OUTPUT);    // zumbador como saída
}

// Programa

void loop(){

  while(digitalRead(doPin) == HIGH){    // Mentres o pulsador doPin estea premido
    tone(zumbador, DO);                 // Soa a nota DO
  }
  while(digitalRead(rePin) == HIGH){
    tone(zumbador, RE);
  }
  while(digitalRead(miPin) == HIGH){
    tone(zumbador, MI); 
  }
  noTone(zumbador);                     // Silencio se non hai nada pulsado 
  
}

Propostas:

Conecta dous interruptores e dous LEDs, con cadansúas resistencias de protección e, utilizando as funcións condicionais, resolve os seguintes problemas:

  1. Mellora do programa “Melodía”: Fai que ao premer un botón soe unha melodía de maneira sincronizada co acendido e apagado duns LEDs.
  2. Piano: Utiliza 7 pulsadores para crear un piano musical. Engade o que falta na práctica do piano.
  3. Variando as notas: Fai que ao mover o cursor do potenciómetro cambie a frecuencia do ton emitido polo altofalante, desde a nota do a 262 Hz ata o si a 494Hz. Utiliza a función map para facer a conversión. y = map(x, ax, bx, ay, by);
  4. Theremin de luz: Conecta unha LDR e un zumbador. Ao achegar e afastar a man sobre a LDR variará a luz recibida por ela. O zumbador emitirá un son cuxa frecuencia variará en función da luz recibida pola LDR. Establece un máximo de nivel de luz (a man afastada do sensor) para o cal o zumbador non emitirá ningún son.

Deixa un comentario