a) lees toetsenbord
b) bepaal de ingedrukte toets
c) afhankelijk van gekozen toets stuur frequentie uit
Let wel dat je het uitgangssignaal waarschijnlijk moet versterken.
En als je helemaal nog geen kennis hebt van de arduino, eerst een zooi tutorials doen. Daarna nadenken hoe je het programma wilt gaan maken en dan pas coderen.
Een andere volgorde geeft een zeer grote kans op falen van het project.
idealiter maak je een tabel met de frequenties in octaaf 7 en deelt die een aantal keren (voor ieder octaaf lager) door 2.
Hier een experimentele sketch die 3 verschillende methoden van frequentie gebruik vergelijkt.
float tabel van 12 met look up formula
float tabel van 128 10+octaven
unsigned tabel van 128 met deling door 8.
De float tabel is snelste en nauwkeurigste en grootste (Zou naar PROGMEM moeten eigenlijk)
216 usec voor 128 lookups == 1.7 usec per lookup (588 000/sec)
de unsigned integer tabel is 8 keer trager maar tabel is 2x kleiner.
verder is hoogste octaaf niet correct.
1672 usec voor 128 lookups == 13.1 usec per lookup (75 000/sec)
float tabel met lookup formula, kleinste footprint maar sloomste.
5968 usec voor 128 lookups == 46.6 usec per lookup (21 400/sec)
//
// FILE: MusicFequencyTable.pde
// AUTHOR: Rob Tillaart
// DATE: 2011-08-12
//
// PUPROSE: generate a frequency table for musical notes
//
float ft[12];
float freqtab[128];
uint16_t f[128];
//#define FREQ(t) (ft[t%12]/(1 << (10-(t/12))))
float FREQ(uint8_t t)
{
uint8_t n = t/12;
uint8_t o = t - n*12;
return (ft[o]/(1 << (10-(n))));
}
void setup()
{
Serial.begin(115200);
// make frequency (Hz) table
double k = 1.059463094359; // 12th root of 2;
double A9 = 14080;
A9 *= k;
A9 *= k; // a
for (int i = 11; i >=0; i--)
{
ft[i] = A9;
A9 /= k;
}
// make frequency (Hz) table
double a = 6.875; // a
a *= k; // b
a *= k; // bb
a *= k; // c, frequency of midi note 0
for (int i = 0; i < 128; i++)
{
freqtab[i] = (float)a;
f[i] = (freqtab[i] * 8 + 0.5);
a *= k;
}
for (int i = 0; i<128; i++)
{
Serial.print(i, DEC);
Serial.print(" \t");
Serial.print(FREQ(i));
Serial.print(" \t");
Serial.print(freqtab[i]);
Serial.print(" \t");
Serial.print((float)f[i]/8.0, 2);
Serial.print(" \t");
Serial.println(100*abs((FREQ(i)-(float)f[i]/8.0)/FREQ(i)), 2);
}
unsigned long before = micros();
volatile float x;
for (int i = 0; i<128; i++)
{
x = FREQ(i);
}
Serial.println(micros()-before);
before = micros();
for (int i = 0; i<128; i++)
{
x = freqtab[i];
}
Serial.println(micros()-before);
before = micros();
for (int i = 0; i<128; i++)
{
x = f[i]/8.0;
}
Serial.println(micros()-before);
}
void loop()
{
}
Ik het voorbeeld gebruikt van Arduino.cc
ik krijg echter volgende fouten:
core.a(main.cpp.o): In function main': C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/main.cpp:34: undefined reference to setup'
C:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino/main.cpp:44: undefined reference to `loop'
Ik gebruik een Arduino 2560 Mega.
En elk ander voorbeeld van arduino kan ik "afspelen"
Maar dat is de identieke code van Arduino.cc
Uiteraard is de tone.h ook aangepast van naam. (origineel pitches.h) op de juiste plaats.
/*
Melody
Plays a melody
circuit:
* 8-ohm speaker on digital pin 8
created 21 Jan 2010
modified 30 Aug 2011
by Tom Igoe
This example code is in the public domain.
http://arduino.cc/en/Tutorial/Tone
*/
#include "tone.h"
// notes in the melody:
int melody[] = {
NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};
// note durations: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4, 8, 8, 4,4,4,4,4 };
void setup() {
// iterate over the notes of the melody:
for (int thisNote = 0; thisNote < 8; thisNote++) {
// to calculate the note duration, take one second
// divided by the note type.
//e.g. quarter note = 1000 / 4, eighth note = 1000/8, etc.
int noteDuration = 1000/noteDurations[thisNote];
tone(8, melody[thisNote],noteDuration);
// to distinguish the notes, set a minimum time between them.
// the note's duration + 30% seems to work well:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// stop the tone playing:
noTone(8);
}
}
void loop() {
// no need to repeat the melody.
}
De foutmelding die je hebt laten zien, geeft fouten op regels 34 en 44.
De code die je hebt laten zien, heeft op regel 34 een commentaarregel waar dus die fout nooit vandaan mag komen.
Regel 44 verwijst naar de library dus ik weet niet wat daar fout zou kunnen zijn (heb m niet geïnstalleerd).
@MAS
de fout is een linker fout die zegt dat setup en loop niet bestaan.
Daar setup en loop gebruikt worden in main.cpp in de arduino core komt de fout -en dus ook de lijnnr van main.cpp- wat niks met de code die op hier zet te maken heeft.
Het lijkt wel of een lege sketch wordt gebruikt.
Een mogelijke verklaring is een niet gesloten commentaar in toon.h
Jantje
To make the pitches.h file, click on the "new Tab" button in the upper right hand corner of the window. It looks like this:
Dus je moet pitches.h zelf maken door een tab in je sketch te openen , die je pitches.h moet noemen, en daar de lijst met alle #defines van tonen en frequenties in copieren.
Of anders ga je op zoek naar tone.h, waar in principe dezelfde data in staat. Ik kom dan uit op Google Code Archive - Long-term storage for Google Code Project Hosting. .
Hier hetzelfde verhaal, je moet een folder maken in je libraryfolder genaamd " tone " en in die folder zet je het bestand tone.h wat je van die bladzijde kunt copieeren.
Alle mogelijkheden om fouten te maken dus. Het copieren kun je niet met iedere tekstverwerker doen omdat die soms de tekst formatteren waardoor je compilatiefouten zoals door jou beschreven zou kunnen krijgen.
Wat er net gebeurd is, ik kan het helaas niet zeggen...
Na mijn dagelijks controle op updates...
En even een ccleaner te hebben losgelaten (ik was bezig aan de koffie, en met de belgische stakingen) nog even opgeladen.
En het werkt...
Geen idee wat er gewijzigd is.
De wondere wereld van Micro$hoft?