Wijzigen van sound afspeel snelheid in TMRPCM

Toon hier Uw afgeronde projecten aan anderen.
Berichten: 3
Geregistreerd: 07 Jun 2022, 10:55

Wijzigen van sound afspeel snelheid in TMRPCM

Berichtdoor Ebro » 07 Jun 2022, 11:31

Hallo allen.
Eerste berichtje al kijk ik al een tijdje mee.
Ik ben Ebro en doe 50 jaar aan de modelbouwhobby in diverse onderwerpen zoals treinen en boten.
Arduino speelt daar de laatste tijd een steeds grotere rol in, op eenvoudige wijze en lerende naar meer.
Dat is nu ook mijn volgende vraag, deze is voor het volgende onderwerp.
Wat wil ik:
Een dieselmotorgeluid opnemen van youtube (sample) en deze afspelen met de librarie TMRPCM.
Dat lukt aardig maar ik wil meer, het toerental van het diesel geluid moet kunnen veranderen in snelheid, in feite sample snelheid verandering.
Ze noemen het ook wel pitch of speed.

standaard is deze optie niet aanwezig in TMRPCM maar ik heb wel een link gevonden:
https://forum.arduino.cc/t/success-getting-tmrpcm-to-change-the-pitch-and-speed-of-sounds/586697
Het laatste voorbeeld in deze discussie heb ik uitgeprobeerd maar ik merk geen toon hoogte verandering.
Hier onder waar de veranderingen moeten gebeuren;

Just solved that as I needed it to work for my project.

The problem is that this code is trying to modify variables that are global within the tmrpcm library code, but not your program. It works if you put it inside the tmrpcm library.

Create a function in the TMRpcm.cpp file, which contains the code which Lucario448 wrote. I called this ‘changespeed’, so my function declaration was this:

void TMRpcm::changespeed(unsigned int newspeed){
unsigned long newSR = map(newspeed, 0, 1023, 8000, 44100);

if (bitRead(optionByte,6)) *ICRn[tt] = 10 * (800000 / newSR);
else *ICRn[tt] = 10 * (1600000 / newSR);
}
and I put this at line 448, just before the area marked

//***************************************************************************************
//********************** Functions for single track playback ****************************
(though I could probably have put this anywhere in the tmrpcm.cpp file).

Then, I modified the ‘TMRpcm.h’ file accordingly, to add the new function to the list of available functions or the compiler gets confused if you don’t. Again, I added this before the play function (line 31)

void changespeed(unsigned int newspeed);
Now, I can call this function from anywhere in my code whenever I want to change the playback speed, if I want to control if from analog0, I just call tmrpcm.changespeed(analogRead(A0));



Mogelijk doe ik nog wat fout, maar ik weet niet wat.

Code: Alles selecteren
//
//Arduino pro mini 5V 16Mhz admega328 en reset indrukken tot uploaden
//losse USB interface driver installeren indien nodig.
//***************************************************************************************
//SD kaart aansluiting:
//SDCS op pin 4
//Mosi op pin 11
//SCK op pin 13
//miso op pin 12
//5V op 5V
//GND op GND
//Aansluiting schakelaars:
//luchtpomp op pin 2.
//Aansluitingen versterker op pin 9 optie pin 10
//Aansluiting voeding min 6V max 12V

//***************************************************************************************
//bestanden:
//toeter1.wav
//toeter2.wav
//toeter3.wav
//***************************************************************************************
//
//***************************************************************************************
#include <SD.h>
#include <SPI.h> //new 22-6-2016
#include <TMRpcm.h>
#define SD_ChipSelectPin 4 // bij arduino nano en uno.
#define toeter1input 2 // input alleen voor luchtpomp.
#define toeter2input 3 // input alleen voor stoombel.
#define toeter3input 5 // input alleen voor kolenscheppen.
#define toeter4input 6 // input alleen voor injecteur.
int toeter1;
int toeter2;
int toeter3;
int toeter4;


TMRpcm tmrpcm;

//**********************
void setup () {
//**********************
  pinMode(toeter1input, INPUT_PULLUP);
  pinMode(toeter2input, INPUT_PULLUP);
  pinMode(toeter3input, INPUT_PULLUP);
  pinMode(toeter4input, INPUT_PULLUP);

  tmrpcm.speakerPin = 9; //voor uno en nano
  // pinMode(10,OUTPUT); //voor tweede speaker

  Serial.begin(9600); // voor manualbedrijf (test)heeft invloed op random duurt lang
  if (!SD.begin(SD_ChipSelectPin)) {
    Serial.println("SD fail");
    return;   //doe niets meer als SD niet aanwezig.
  }
  else {
    Serial.println("SD ok");
  }
  tmrpcm.setVolume(2);



  tmrpcm.play("toeter1.wav");  //eerste test setup geluid
  delay(4000);

}
//*************************
void loop() {
//*************************

  toeter1 = digitalRead(toeter1input);
  toeter2 = digitalRead(toeter2input);
  toeter3 = digitalRead(toeter3input);
  toeter4 = digitalRead(toeter4input);

  if (toeter1 == LOW) {
    Toeter1();
  }
  if (toeter2 == LOW) {
    Toeter2();
  }
  if (toeter3 == LOW) {
    Toeter3();
  }
  if (toeter4 == LOW) {
    Toeter4();
  }
}




//****************
void Toeter1() {
  //****************
  tmrpcm.setVolume(5);
  // tmrpcm.changespeed(1);
  tmrpcm.loop(1);
  tmrpcm.play("toeter1.wav");
  //  Serial.println ("toeter1");
}

//**************
void Toeter2() {
  //************
  tmrpcm.setVolume(5);
  tmrpcm.loop (1);
  tmrpcm.play("toeter2.wav");
  //  Serial.println ("toeter2");
}

//*******************
void Toeter3() {
  //*******************
  tmrpcm.setVolume(5);
  //  tmrpcm.changespeed(1000);
  tmrpcm.loop (1);
  tmrpcm.play("toeter3.wav");
  //  Serial.println ("toeter3");
}

//********************
void Toeter4() {
  //********************
  tmrpcm.setVolume(5);
  // tmrpcm.changespeed(1);
  tmrpcm.loop(1);
  tmrpcm.play("toeter4.wav");
  //  Serial.println ("toeter4");
}


Bovenstaande code werkt goed, deze is zonder toon hoogte verandering. //tmrpcm.changespeed(1) staat nog uit omdat de tmrpcm.cpp en tmrpcm.h niet goed werken.
Kan iemand mij op weg helpen?
Mogelijk zijn er andere oplossingen.

groetjes Ebro

Advertisement

Terug naar Afgeronde projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast