0

Software volume control
Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.

Software volume control

by stoopid_jerk on Sun Oct 25, 2009 6:31 am

Hi there,

recently put together my Waveshield, thanks for this great kit and the clear instructions for assembly and great libraries and examples and lots of information here on this forum. Everything worked out of the box for me, which i didn't really expect would happen but ok thats great.

I want to do software volume control, un#defined the DVOLUME const in the AF_Wave library and that worked. But i get a popping noise when i change the volume. I tried with WaveHC as well, which required a bit more hacking than just the #define in AF_Wave, but with the same results. Have others experienced this as well, or maybe i've done something wrong? If this is expected, any tips on how to eliminate this popping?


thanks in advance
dave
stoopid_jerk
 
Posts: 1
Joined: Sun Oct 25, 2009 6:17 am

Re: Software volume control

by adafruit on Sun Oct 25, 2009 2:44 pm

the volume control is kinda iffy. and if you change the volume quickly you'll make a square wvae. so adjust it -slooowly- :)

adafruit
 
Posts: 12151
Joined: Thu Apr 06, 2006 4:21 pm
Location: nyc

Re: Software volume control

by rafaelvc on Thu Mar 24, 2011 3:50 pm

Hi there,

I am a new Arduino and Waveshield user and I know It has been a while since the last reply in this post, but I would like to know how to use volume control with WaveHC.

I tried "SoftVolumeHC", an example that came with WaveHC, but it wont compile in any way. This is what I get as error messages:

'class WaveHC has no member named volume'
SoftVolumeHC.cpp: In function 'void playcomplete(FatReader&)':
SoftVolumeHC:109: error: 'class WaveHC' has no member named 'volume'
SoftVolumeHC:112: error: 'class WaveHC' has no member named 'volume'
SoftVolumeHC:113: error: 'class WaveHC' has no member named 'volume'
SoftVolumeHC:114: error: 'class WaveHC' has no member named 'volume'


If somebody has any clue about it, I'd be very glad to hear it.
Thanks in advance,
Rafael Vasconcelos
rafaelvc
 
Posts: 2
Joined: Thu Mar 24, 2011 3:36 pm

Re: Software volume control

by mtague on Sun Mar 27, 2011 10:11 am

It compiles if you change DVOLUME to nonzero in the WaveHC.h file (from zero to one, for example). This step is in the comment right above the line that the compiler has an issue with, near the bottom of the sketch:

Code: Select all | TOGGLE FULL SIZE
    // DVOLUME must be nonzero in WaveHC.h to use volume.
    Serial.println(wave.volume, DEC);
     
    delay(2000);
    wave.volume++;
    if ( wave.volume == 12) {
      wave.volume = 0;
    }
  }
  sdErrorCheck();
}


Reading the comments in the sketch is a good thing to do when you're a noob (finding this out myself, as I'm also a noob). :D
mtague
 
Posts: 2
Joined: Thu Mar 10, 2011 9:10 pm

Re: Software volume control

by rafaelvc on Tue Mar 29, 2011 5:35 pm

thanks, mtague, for the help. It is working now very nicely.

Yes, you're right about reading the comments. But I am quite sure I read it, but of course I missed it. I'll pay more attention next time.

Thanks again. Best regards,
Rafael Vasconcelos
rafaelvc
 
Posts: 2
Joined: Thu Mar 24, 2011 3:36 pm

Re: Software volume control

by mtague on Wed Mar 30, 2011 11:12 am

I was actually having the exact same problem you were, but reading your post made me recheck the code again and I found that sneaky little code comment. :D
mtague
 
Posts: 2
Joined: Thu Mar 10, 2011 9:10 pm

Re: Software volume control

by maurin on Thu Jul 07, 2011 8:04 am

I'm trying to use wave.volume but each time I change the value I get a clic :?

maurin
 
Posts: 6
Joined: Wed May 20, 2009 1:05 pm

Re: Software volume control

by adafruit_support_bill on Thu Jul 07, 2011 8:11 am

the volume control is kinda iffy. and if you change the volume quickly you'll make a square wvae. so adjust it -slooowly-

adafruit_support_bill
 
Posts: 73519
Joined: Sat Feb 07, 2009 10:11 am

Re: Software volume control

by maurin on Thu Jul 07, 2011 11:16 am

Below the code i use, I added a fadeIn fadeOut fonction.
The delay between each wave.volume changes is set @ 500 millis but I still have those clic.
Is ther a way to avoid it ?

Code: Select all | TOGGLE FULL SIZE
#include "WaveUtil.h"
#include "WaveHC.h"

SdReader card;       // This object holds the information for the card
FatVolume vol;       // This holds the information for the partition on the card
FatReader root;      // This holds the information for the filesystem on the card
FatReader file;       // This holds the information for the file we're play
WaveHC wave;         // This is the only wave (audio) object...

# define THRESHOLD      250              // define threshold
# define fadeTime       500                 // define fade time

boolean rising = false;
boolean fade = false;                        // set the fade direction IN - OUT
boolean DEBUG = true;

unsigned int reading = 0;

unsigned int fadeValue = 12;               // hold fade value
unsigned long lastTime = 0;                 // hold time value
unsigned int volume = 0;                     // hold volume value

/////////////////////////////////////////////////////////////////////////////////

void setup(){
  Serial.begin(9600);   // set up serial port
  putstring_nl("WaveHC IR sensor");

  // Set the output pins for the DAC control. This pins are defined in the library
  pinMode(2, OUTPUT);    // SLAVESELECT
  pinMode(3, OUTPUT);    // CLOCK
  pinMode(4, OUTPUT);    // DATA
  pinMode(5, OUTPUT);    // GND
  pinMode(13, OUTPUT);   // LED pin also SCK pin for (ISP)

  if(!card.init()) {                     // play with 8 MHz spi (default faster!) 
    putstring_nl("Card init. failed!");  // Something went wrong, lets print out why
    while(1);                            // then 'halt' - do nothing!
  }

  card.partialBlockRead(true);  // enable optimize read

  // Now we will look for a FAT partition!
  uint8_t part;
  for(part = 0; part < 5; part++) {      // we have up to 5 slots to look in
    if(vol.init(card, part))
      break;                             // we found one, lets bail
  }
  if(part == 5) {                        // if we ended up not finding one  :(
    putstring_nl("No valid FAT!");
    while(1);                            // then 'halt' - do nothing!
  }

  // Lets tell the user about what we found
  putstring("Using partition ");
  Serial.print(part, DEC);
  putstring(", type is FAT");
  Serial.println(vol.fatType(),DEC);      // FAT16 or FAT32?

  // Try to open the root directory
  if(!root.openRoot(vol)) {
    putstring_nl("Can't open root dir!"); // Something went wrong,
    while(1);                             // then 'halt' - do nothing!
  }
  putstring_nl("Ready!");                 // Whew! We got past the tough parts.
}

/////////////////////////////////////////////////////////////////////////////////

void loop(){

  reading = analogRead(A0);

  if(reading < THRESHOLD && rising == true){
    if(DEBUG)Serial.println("OFF");
    rising = false;
  }
  if(reading > THRESHOLD && rising == false){
    if(DEBUG)Serial.println("ON");
    rising = true;
    playfile("LOOP.WAV");
  }
  wave.volume = fadeInOut(fadeTime, rising, fadeValue);
}

/////////////////////////////////////////////////////////////////////////////////

void playfile(char *name){
 
  // see if the wave object is currently doing something
  if(wave.isplaying) {  // already playing something, so stop it!
    wave.stop();        // stop it
  }
  // look in the root directory and open the file
  if(!file.open(root, name)) {
    putstring("Couldn't open file");
    Serial.print(name);
    return;
  }
  // OK read the file and turn it into a wave object
  if(!wave.create(file)){
    putstring_nl("Not a valid WAV");
    return;
  }
  wave.play();   // ok time to play! start playback
}

////////////////////////////////////////////////////////////

unsigned int fadeInOut(const int del, boolean fade, unsigned int &fadeVal){

  if(fade == true){ // fade IN
    if(fadeVal < 1) return 0;
    if((millis() - lastTime) > del){
      fadeVal--;
      lastTime = millis();
      if(DEBUG)Serial.println(fadeVal, DEC);
      return fadeVal;
    }
  }
  if(fade == false){ // fade OUT
    if(fadeVal > 11) return 12;
    if((millis() - lastTime) > del){
      fadeVal++;
      lastTime = millis();
      Serial.println(fadeVal, DEC);
      return fadeVal;
    }
  }
}





maurin
 
Posts: 6
Joined: Wed May 20, 2009 1:05 pm

Re: Software volume control

by adafruit_support_bill on Thu Jul 07, 2011 11:36 am

Anytime you have a step-change in the output level there will be a click. The best you can do is to keep the step levels as small as possible.

adafruit_support_bill
 
Posts: 73519
Joined: Sat Feb 07, 2009 10:11 am

Re: Software volume control

by fat16lib on Thu Jul 07, 2011 12:19 pm

The volume steps in WaveHC are large so there are clicks.

I worked with an artist to develop a player with finer volume control based on my other audio library, WaveRP.

It is limited to 22.05 ksps files due to the overhead of finer volume control and is very experimental.

It tries to do one db steps in volume.

You need to install the latest version of SdFat to use it.

http://code.google.com/p/sdfatlib/downloads/list

I have attached the library.

See the readme file and try the sketch, dapRPvol.pde.
Attachments
dbPerStep.zip
(14.06 KiB) Downloaded 147 times
fat16lib
 
Posts: 593
Joined: Wed Dec 24, 2008 1:54 pm

Re: Software volume control

by EddieVerso on Tue Oct 02, 2012 11:51 am

Hi man, I'm trying this library but, after the installation, I can't compile due to this error:

'Class WaveRP' has no member named 'setVolume'

DBperStep.cpp: In function 'void play(SdBaseFile*)':
DBperStep:104: error: 'class WaveRP' has no member named 'setVolume'
DBperStep:116: error: 'class WaveRP' has no member named 'setVolume'

Thanks man, I hope this library will solve my volume changing problems :)
EddieVerso
 
Posts: 16
Joined: Fri Sep 28, 2012 7:38 am

Re: Software volume control

by EddieVerso on Wed Oct 03, 2012 6:23 am

Sorry, i forgot to set DVOLUME 1 in the library, my fault :D

Anyway now it works well, tnx for the library!
EddieVerso
 
Posts: 16
Joined: Fri Sep 28, 2012 7:38 am

Please be positive and constructive with your questions and comments.