Tonleiter zählt selbst den Ton hoch

Hallo zusammen,

hört sich sicher für Euch langweilig an, aber als Neuling popel ich bereits ne Weile
an dem Problem, dass ich eine Tonleiter basteln will die nicht 4000 Zeilen Text hat und ich jeden Ton in einzeln hoch zähle
tone(11,245,1000);
tone(11,246,1000);
tone(11,247,1000);......

sondern das es mehr so aussieht:

int Anstieg=0

tone(11, Ansteig,1000);
Anstieg=Anstieg+5

So das der Ton bei 0 HZ anfängt in 5 HZ schritten hoch zu zählen.

Das würde mächtig viel Text sparen.

Für Eure Tipps danke ich bereits im Voraus.

Timo

eine for schleife wäre wohl das passende oder?

for loop - cppreference.com

Die Doku sagt:
Es ist nicht möglich, Töne mit einer Frequenz niedriger als 31Hz zu erstellen.

  for(unsigned frequenz=35;frequenz<=100;tone(3,frequenz),delay(1000),noTone(3),frequenz+=5);

const byte tonePin = 11;
const uint32_t toneTime = 1000;
const uint16_t minToneFreq = 50;
const uint16_t stepToneFreq = 5;
const uint16_t maxToneFreq = minToneFreq + 3190 * stepToneFreq ; // 16000 Hz
uint16_t toneFreq = minToneFreq;
uint32_t toneStartTime = 0;
bool toneStart = true;
void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
}

void loop()
{
  tonLeiter();
}

void tonLeiter()
{
  if (toneStart)
  {
    noTone(tonePin);
    toneFreq = minToneFreq;
    toneStart = false;
    tone(tonePin, toneFreq);
    toneStartTime = millis();
  }
  else
  {
    if (millis() - toneStartTime >= toneTime)
    {
      noTone(tonePin);
      toneFreq += stepToneFreq;
      toneStartTime = millis();
      tone(tonePin, toneFreq);
      if (toneFreq >= maxToneFreq)
      {
        toneStart = true;
      }
      Serial.print(F("Neue Frequenz: "));
      Serial.println(toneFreq);
    }
  }
}

Um eine Tonleiter zu erzeugen solltest du
eher toneFreq *= HALBTONSCHRITT; verwenden.

Der chromatische Halbtonschritt ist übrigens der Faktor 1,059463094359 (12te Wurzel aus 2)
Ein Ganztonschritt sind zwei Halbtonschritte, also 1,059463 * 1,059463 = 1,122462

Eine "normale" Dur-Tonleiter besteht übrigens aus den Schritten
*1,122462
*1,122462
*1,059463
*1,122462
*1,122462
*1,122462
*1,059463
und sollte danach ziemlich genau bei der doppelten Frequenz des Anfangstons sein.

Aber du (@jeep-timo) wolltest es ja eine einfach for-Schleife haben, daher die 12 Halbtonschritte bis zur doppelten Frequenz

Nein.
Wollte ich nicht.
Vielleicht nochmal den Adressaten ermitteln.

Hast du aber.
Na gut, hat schon @combie so vorgegeben, und welcher Ansatz einfacher (lesbar) ist, ist Geschmackssache.
Einfacher zu zitieren war deiner. Angesprochen ist jeder, der das Wort "Tonleiter" verwendet.
Mein Ansatz ist nur, dass man eher den Operator *= statt += verwenden sollte.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.