Jump to content

[Finished!] Wall Scale Graphic Equaliser Build Log

Welcome all to my graphic equaliser build log.

 

A graphic equaliser is simply a graphic display of various frequency bands of audio.

My plan is to build one from LEDs (specifically an LED strip), and mount it on my wall.

 

I've actually done a fair bit of work on this so far, but I wanted to make sure i was going to actually finish the project before I posted about it.

My plan is eventually to have this mounted on my wall.

 

The basic operation is around the MSGEQ7 graphic equaliser chip and an Arduino Uno (Atmega 328p) microcontroller.

The MSGEQ7 outputs an analogue voltage between 0 and 5V based on the amplitude of a given input within 1 of it's 7 frequency bands.

The datasheet can be seen below for those of you who are interested:

https://www.sparkfun.com/datasheets/Components/General/MSGEQ7.pdf

I can go into more detail on this if people are interested, but I won't waste my hypothetical breath on it if no one is!

 

This output is connected to an analogue input on the Arduino, and read by the software.

The Arduino then drives serial data to the WS2812S LED strip (using the FastLED library).

The LED strip is RGB and 5m long (300 LEDs).

I've split this into 7 frequency bands, so each 43 LEDs represents one frequency band.

 

The idea is that each band lights up a number of LEDs based on the volume of the sound in that frequency band (i.e. a graphic equaliser).

 

The software is the magic part of this project, so the code can be seen below, plus some photos.

 

The next stage is to get the hardware soldered onto strip board, and cut up the LED strip into 7 parts.

I'm hoping that the code doesn't need much change from this point as I am trash at software (I'm an electronics engineer) compared to hardware.

 

I've put up a YouTube video of it in it's current state in operation (apologies for the trash quality. It was on my phone and YouTube compression, lol).

https://youtu.be/rzZRBRx6bKg

 

Any questions, fire away!

I'll post updates as regularly as I do them :)

 

Code:

Spoiler

#include <FastLED.h> //Used to drive the WS2812B LED strip.

#define STROBE_PIN 5 //output pin used to send strobe to equaliser
#define RESET_PIN 7 //reset pin on equaliser
#define AUDIO A5 //audio input pin

//LED macros:
#define LED_PIN 6 //Output pin used to send serial data to the LED strip
#define NUM_LEDS 300 //total number of LEDs

CRGB leds[NUM_LEDS]; //This is an object used to control the RGB LED strip. We have to tell it how many LEDs are in the strip.

const int led_bands[8]{               //array defining the end of each audio band
  0, 42, 85, 128, 171, 214, 257, 300
};

int audioin[7]; //array defining the amplitude of each audio band
int audioinfo[7]; //array defining the number of LEDs to be lit for each audio band
int ledinfo[7]; //array defining LED brightness for each audio band
int audioinaverage[49]; //array of 7 reads of the MSGEQ7 to be averaged
int red; //RGB red value 0-255
int green; //RGB green value 0-255
int blue; //RGB blue value 0-255

void setup() {
  //setup pins for I/O
  pinMode(STROBE_PIN, OUTPUT);
  pinMode(RESET_PIN, OUTPUT);
  pinMode(AUDIO, INPUT);

  //setup FastLED library
  FastLED.addLeds<WS2812, LED_PIN>(leds, NUM_LEDS); //This instructs the leds object to set up our LED strip. We have to tell it what kind of LEDs we're using (WS2812), how many LEDs we want to control, and what pin to use.

  //setup MSGEQ7 chip
  digitalWrite(STROBE_PIN,HIGH);
  digitalWrite(RESET_PIN, HIGH);
  delay(1);
  digitalWrite(RESET_PIN, LOW);
  delay(1);

  //adjustment for analgue reference on the chip
  analogReference(DEFAULT);
}

void loop() {
  int i=0; //integers used for loops
  int k=0;
  readmsgeq(i); //function to read all audio bands 7 times and store the data in an array
  createarrays(i); //function to average the audio inputs, and create the arrays for LEDs to use
  writeleds(i, k); //function to drive the LED strip
  FastLED.show(); //update the LED strip with the written values
  //delay(50); //currently unused delay
}

void readmsgeq(int i){  
    for(i=0; i<49; i++){ //reads the MSGEQ7 49 times (7 values for each of the 7 frequency bands)
      digitalWrite(STROBE_PIN, LOW); //strobe pin pulsed low and high as per the datasheet
      delayMicroseconds(40);
      audioinaverage[i]=analogRead(AUDIO); //set the analog output of the MSGEQ7 to an integer value between 0-1024 (0-5V)
      digitalWrite(STROBE_PIN, HIGH);
      delayMicroseconds(40);
    }
}

void createarrays(int i){
  for(i=0; i<7; i++){ //create an average of the audio frequency band amplitude
    audioin[i]=(audioinaverage[i]+audioinaverage[i+7]+audioinaverage[i+14]+audioinaverage[i+21]+audioinaverage[i+28]+audioinaverage[i+35]+audioinaverage[i+42])/7;
  }
  
  audioin[6]=audioin[6]-30; //band 7 reads high (noise), so reduce by 30
  audioin[4]=audioin[4]-30; //band 5 reads high (noise), so reduce by 30

  for (i=0; i<7; i++){ //map analog values to LED brightness and number of LEDs to be written
    audioinfo[i]=map(audioin[i], 0, 1024, 0, 43);
    ledinfo[i]=map(audioin[i], 0, 1024, 0, 255);
    }
  for (i=0; i<7; i++){ //set output to 0 if no input detected (<40)
    if(ledinfo[i]<40){
      ledinfo[i]=0;
    }
  }
}
  
void writeleds(int i, int k){
  
  for(i=0; i<7; i++){ //light LEDs for each band
    int j=led_bands[i]+audioinfo[i]; //set end LED to j  based on frequency band volume
    for(k=led_bands[i]; k<=j; k++){ //light LEDs from start of band to end LED in that band
      if(k<(led_bands[i+1]-15)){ //first 38 LEDs set to green only
        red=0;
        green=ledinfo[i];
        blue=0;
      }
      else if(k<(led_bands[i+1]-5)){ //next 5 leds set to yellow
        red=ledinfo[i];
        green=ledinfo[i];
        blue=0;
      }
      else{ //last 5 leds set to red
        red=ledinfo[i];
        green=0;
        blue=0;
      }
      leds[k] = CRGB(green, red, blue); //set LED
    }
    j=led_bands[i+1]-(43-audioinfo[i]); //this part is just to write any not written LEDs to off, otherwise once written, the LED will never turn off
    for(k=led_bands[i+1]; k>=j; k--){
      leds[k] = CRGB(0, 0, 0);
    }
  }
}

 

Photos:

Spoiler

IMG_20190222_144652.jpg

IMG_20190222_144658.jpg

IMG_20190222_144752.jpg

IMG_20190222_144642.jpg

 

Link to comment
Share on other sites

Link to post
Share on other sites

Seems like the video got taken down for audio. Are you diffusing the light at all or just running straight LED strips? 

 

Link to comment
Share on other sites

Link to post
Share on other sites

16 hours ago, DubMFG said:

Seems like the video got taken down for audio. Are you diffusing the light at all or just running straight LED strips? 

 

Yea, I've disputed it, so hopefully be back up in a couple of days.

 

I'm going to see how it looks once it's mounted and decide if it needs any diffusion or not.

Right now it is pretty eye watering, so most likely will add a diffuser! 

Link to comment
Share on other sites

Link to post
Share on other sites

I updated the code and hardware a bit today to include an ambient brightness adjustment.

This uses a potential divider network with an LDR and a fixed resistor.

 

It was a little bit jarring at first so I put some averaging in, which seems to have helped :)

 

Now the LEDs brightness changes depending on the ambient brightness.

 

Updated code below:

Spoiler

#include <FastLED.h> //Used to drive the WS2812B LED strip.

#define STROBE_PIN 5 //output pin used to send strobe to equaliser
#define RESET_PIN 7 //reset pin on equaliser
#define AUDIO A5 //audio input pin
#define BRIGHT A0 //brightness input pin

//LED macros:
#define LED_PIN 6 //Output pin used to send serial data to the LED strip
#define NUM_LEDS 300 //total number of LEDs

CRGB leds[NUM_LEDS]; //This is an object used to control the RGB LED strip. We have to tell it how many LEDs are in the strip.

const int led_bands[8]{               //array defining the end of each audio band
  0, 42, 85, 128, 171, 214, 257, 300
};

int audioin[7]; //array defining the amplitude of each audio band
int audioinfo[7]; //array defining the number of LEDs to be lit for each audio band
int ledinfo[7]; //array defining LED brightness for each audio band
int audioinaverage[49]; //array of 7 reads of the MSGEQ7 to be averaged
int brightnessaverage[100]; //array for 100 reads of external brightness
int red; //RGB red value 0-255
int green; //RGB green value 0-255
int blue; //RGB blue value 0-255
int brightness; //LED brightness value
int d; //main loop integer

void setup() {
  //setup pins for I/O
  pinMode(STROBE_PIN, OUTPUT);
  pinMode(RESET_PIN, OUTPUT);
  pinMode(AUDIO, INPUT);

  //setup FastLED library
  FastLED.addLeds<WS2812, LED_PIN>(leds, NUM_LEDS); //This instructs the leds object to set up our LED strip. We have to tell it what kind of LEDs we're using (WS2812), how many LEDs we want to control, and what pin to use.

  //setup MSGEQ7 chip
  digitalWrite(STROBE_PIN,HIGH);
  digitalWrite(RESET_PIN, HIGH);
  delay(1);
  digitalWrite(RESET_PIN, LOW);
  delay(1);

  //adjustment for analgue reference on the chip
  analogReference(DEFAULT);
}

void loop() {
  setbrightness(0, 0); //sets LED brightness based on ambient light
  for(d=0; d<100; d++){
    readmsgeq(0); //function to read all audio bands 7 times and store the data in an array
    createarrays(0); //function to average the audio inputs, and create the arrays for LEDs to use
    writeleds(0, 0); //function to drive the LED strip
    FastLED.show(); //update the LED strip with the written values
    brightnessaverage[d]=analogRead(BRIGHT); //take a reading of brightness
    //delay(50); //currently unused delay
  }
}

void readmsgeq(int i){  
    for(i=0; i<49; i++){ //reads the MSGEQ7 49 times (7 values for each of the 7 frequency bands)
      digitalWrite(STROBE_PIN, LOW); //strobe pin pulsed low and high as per the datasheet
      delayMicroseconds(40);
      audioinaverage[i]=analogRead(AUDIO); //set the analog output of the MSGEQ7 to an integer value between 0-1024 (0-5V)
      digitalWrite(STROBE_PIN, HIGH);
      delayMicroseconds(40);
    }
}

void createarrays(int i){
  for(i=0; i<7; i++){ //create an average of the audio frequency band amplitude
    audioin[i]=(audioinaverage[i]+audioinaverage[i+7]+audioinaverage[i+14]+audioinaverage[i+21]+audioinaverage[i+28]+audioinaverage[i+35]+audioinaverage[i+42])/7;
  }
  
  audioin[6]=audioin[6]-30; //band 7 reads high (noise), so reduce by 30
  audioin[4]=audioin[4]-30; //band 5 reads high (noise), so reduce by 30

  for (i=0; i<7; i++){ //map analog values to number of LEDs to be written
    audioinfo[i]=map(audioin[i], 0, 950, 0, 43);
    if(audioinfo[i]<6){ //sets first 5 LEDs to "off" if volume is effectively 0
      audioinfo[i]=0;
    }
    }
}

void setbrightness(int i, long brightnessint){
  for(i=0; i<100; i++){ //loop to sum all 100 brightness readings
    brightnessint=brightnessint+brightnessaverage[i];
  }
  brightness=brightnessint/100; //averages all led brightness values read
  
  for (i=0; i<7; i++){ //map analog values to LED brightness and number of LEDs to be written
    ledinfo[i]=map(brightness, 70, 200, 100, 255);  //sets led brightness between 100 and 255 based on ambient light
    }
}
  
void writeleds(int i, int k){
  
  for(i=0; i<7; i++){ //light LEDs for each band
    int j=led_bands[i]+audioinfo[i]; //set end LED to j  based on frequency band volume
    for(k=led_bands[i]; k<=j; k++){ //light LEDs from start of band to end LED in that band
      if(k<(led_bands[i+1]-20)){ //first 23 LEDs set to green only
        red=0;
        green=ledinfo[i];
        blue=0;
      }
      else if(k<(led_bands[i+1]-10)){ //next 10 leds set to yellow
        red=ledinfo[i];
        green=ledinfo[i];
        blue=0;
      }
      else{ //last 10 leds set to red
        red=ledinfo[i];
        green=0;
        blue=0;
      }
      leds[k] = CRGB(green, red, blue); //set LED
    }
    j=led_bands[i+1]-(43-audioinfo[i]); //this part is just to write any not written LEDs to off, otherwise once written, the LED will never turn off
    for(k=led_bands[i+1]; k>=j; k--){
      leds[k] = CRGB(0, 0, 0);
    }
  }
}

 

 

My last few hardware bits (including a shiny new soldering iron) arrive tomorrow, so I can get on with the proper build.

That's all for now.

Next update is most likely to be Friday when I've got some free time after work.

Link to comment
Share on other sites

Link to post
Share on other sites

I can appreciate the extensive commenting in your code! 

 

There looks to be a short delay between the audio and the visual, I wonder what the interpolation delay is between the source and output. 

 

With some diffusion on there I think that will be awesome! Perhaps you could use the strip to illuminate a frosted plexiglass panel  from the bottom, like this:

 

LED4.jpg

 

 

Link to comment
Share on other sites

Link to post
Share on other sites

16 hours ago, DubMFG said:

I can appreciate the extensive commenting in your code! 

 

There looks to be a short delay between the audio and the visual, I wonder what the interpolation delay is between the source and output. 

 

With some diffusion on there I think that will be awesome! Perhaps you could use the strip to illuminate a frosted plexiglass panel  from the bottom, like this:

 

-snip-

Haha, thanks!

 

The only delay should be the time for the main loop to run.

I did experiment adding a delay on every main loop (see commented out delay of 50ms in "void loop"), but it just made the LEDs look weird with the audio.

The only delays in there currently are the 40 microsecond ones requried for correct operation of the MSGEQ7. Everything else should be as fast as the arduino can do it!

 

The delay of the MSGEQ7 is close to 0, but the loop certainly takes a little while to run. Initially I had the "for" loop in main go 1000 times between brightness setting, and that took about 10 seconds to update the LEDs. That suggests about 10ms per loop (input to output), and I think most of that is the FastLED library.

 

I love the plexi glass idea- I'll have to look into the cost and how easy they'd be to wall mount without looking s***!

 

I've got some diffusers sitting in my Amazon basket.

Going to see how the LEDs look mounted bare on the wall before pulling the trigger (they're £35 for 10, which seems a little expensive to me!)

Link to comment
Share on other sites

Link to post
Share on other sites

Update from yesterday afternoon's work.

Started putting the system together.

 

I've soldered the MSGEQ7 board together, and wired this into the power supply and arduino.

The power supply board has had the mains power soldered on.

I'll let the photos do the talking :)

 

Work still remaining:

  • Machining of the box to allow connectors and switch to be mounted. Hole to get the LED wiring out too.
  • Power supply connections to the arduino
  • Fitting switch to the power supply input (I'l have to de-solder what I've done already to do this. I forgot it!)
  • Cutting LED's down to strips of 43.
  • Connecting dataline between arduino and LED strip.
  • Connecting power supply to each band's LED stip.
  • Gromits fitted to cable holes on the box.
  • Sleeving of external cables.
  • Mount PCBs in box.

Photos:

Spoiler

Shiny new kit

IMG_20190301_135134.thumb.jpg.9759518b034bee919c21ada01036fd98.jpg

 

Power supply and mains input to be soldered

IMG_20190301_140227.thumb.jpg.6c616272ed0bb6b013667ebfa01a9f02.jpg

 

Power supply input soldered

IMG_20190301_140935.thumb.jpg.277b9d0964e7af064e1e8ecdaf751fa6.jpg

 

Worst soldering job in history! (No idea how I ever got J-STD qualified!)

IMG_20190301_151218.thumb.jpg.89458ef996dbaaff896bb645f0846cdd.jpg

 

Final layout

IMG_20190301_153601.thumb.jpg.2ea7d1c5bcf970d32a3eff9e55499784.jpg

 

Power supply soldered to MSGEQ7 board

IMG_20190301_155052.thumb.jpg.6642947bfcd890eff1b1a15f2de87fff.jpg

 

Arduino connections to MSGEQ7 made

IMG_20190301_160623.thumb.jpg.17fc21d8eee12c0619a993e60c2551b4.jpg

Putting these photos in I've noticed a fairly big problem with the audio input.

10 internet points to anyone who notices it!

 

More updates to come later today hopefully :)

 

 

 

Link to comment
Share on other sites

Link to post
Share on other sites

So after a little fault finding and A LOT more soldering, the electronics are up and running.

All that's left now is the getting it in a box and making everything neat and tidy.

 

The LEDs are all soldered to the power supply, each other, and broken out into 7 strips.

I've ordered diffusers because the strips are super delicate now they're not in the plastic.

 

I've tested them and they're look great.


It's super messy right now.

Needs untangling real bad, then can start getting bits into the box :)

Spoiler

IMG_20190302_154021.thumb.jpg.1e7902e7144087d0460839e551d06fc8.jpg

 

IMG_20190302_154033.thumb.jpg.534ea6328d97737e6d9f000b744e8af6.jpg

 

IMG_20190302_150102.thumb.jpg.115fe12d1f2813221335894d92cfb207.jpg

 

IMG_20190302_174825.thumb.jpg.13b3d683e2c5f877a5ccee7b96f467da.jpg

 

Link to comment
Share on other sites

Link to post
Share on other sites

Well, my comments would be:

 

* Those yellow capacitors are overkill. I would have used plain 0.1uF ceramic capacitors.

* The power supply choice is kind of strange. I wouldn't have used such power supply for 15w max, considering you have to be careful about isolation and you have to solder the wires to the terminals.

I would have used a 12v..18v wall-wart adapter (here's a $7 example) , or a regular 20-30VA linear transformer, and then a 12v to 5v switching power supply (if the voltage is higher than 5v). These are 1-2$ on eBay (here's a $0.99 example  ) or a few dollars at electronic distributors like Digikey, Farnell, Mouser etc 

This would allow you to simply use a standard barrel jack connector to power

* You can power the arduino board by soldering a couple of wires on the linear regulator by the barrel jack.  I think the big pin is Vout (5v) or Ground and one of the 3 pins on the other side is ground (Vin , gnd/adjust , Vout) ... so you could tap on the regulator instead of shoving wires into the IO and run 5v through the thin traces on the board.

* I would have added a stereo jack on the tiny board with the equalizer thing

 

I'm not sure what to think about using only red and black on the led strips, maybe data wire should be a different color but at least it's different thikness.

 

 

Link to comment
Share on other sites

Link to post
Share on other sites

13 hours ago, mariushm said:

Well, my comments would be:

 

* Those yellow capacitors are overkill. I would have used plain 0.1uF ceramic capacitors.

* The power supply choice is kind of strange. I wouldn't have used such power supply for 15w max, considering you have to be careful about isolation and you have to solder the wires to the terminals.

I would have used a 12v..18v wall-wart adapter (here's a $7 example) , or a regular 20-30VA linear transformer, and then a 12v to 5v switching power supply (if the voltage is higher than 5v). These are 1-2$ on eBay (here's a $0.99 example  ) or a few dollars at electronic distributors like Digikey, Farnell, Mouser etc 

This would allow you to simply use a standard barrel jack connector to power

* You can power the arduino board by soldering a couple of wires on the linear regulator by the barrel jack.  I think the big pin is Vout (5v) or Ground and one of the 3 pins on the other side is ground (Vin , gnd/adjust , Vout) ... so you could tap on the regulator instead of shoving wires into the IO and run 5v through the thin traces on the board.

* I would have added a stereo jack on the tiny board with the equalizer thing

 

I'm not sure what to think about using only red and black on the led strips, maybe data wire should be a different color but at least it's different thikness.

 

 

All fair comments.

Cheap was the name of the game here.

All your suggestions make a lot of sense.

The purchasing decisions were based on what I already had laying around and how inexpensive stuff was.

 

The 0.1uF caps were what I had around from an old project (they were used for decoupling power supplies on that).

I don't have a spare wall wart adapter or barrel jack laying around, but I do have a spare mains plug and twin and earth cable, hence the straight 240V->5V PSU (which was also only £12). 15W should be plenty for the application.

All my stuff was from Mouser or RS components (so a little more expensive than ebay) as I was burnt initially buying the MSGEQ7's off ebay, which all had at least one band not working.

Soldering onto the regulator would have been a way better idea than hot glueing into the power headers. I might change that later, I'm hardly pulling any power through the Arduino so shouldn't have a problem at least.

Stereo jack is going to be mounted on the enclosure, so did it with flying leads so I could choose where to put it on the box (who needs signal integrity anyway right?).

Different colours for the data would have been handy for building, but since it's going to be mounted on my wall, and I don't think I'm going to be able to hide all the data lines, I used black to try and make them less obvious. The different type was sufficient to not get them confused!

 

If I was building again from scratch, and money no object, I'd have definitely done the power supply in a more efficient way, and I'd probably design a proper PCB for the Atmega and MSGEQ, rather than just mounting the entire dev board in the box!

 

Cheers for the feedback, it's very much appreciated.

To be perfectly honest I didn't put nearly enough thought into the power delivery.

I went for quick and easy rather than a good engineering solution (which probably would have been less expensive too)!

Link to comment
Share on other sites

Link to post
Share on other sites

Put a good few hours into the project last night.

Didn't have time to post an update here, but planning on having it finished this evening.

 

Last night, I kind of restarted the LED part of the build, as when I tried to untangle the mess of LED strips, the data lines pulled their pads off the strip.

I bought some new LEDs and the diffusers. Since the diffusers were a metre long, I made the LED strips for each band a metre long too.

This means I've now got 420 LEDs (60 per band) rather than 300.

The code will need a bit of adjustment to work with this.

 

So, last night I cut the enclosure to fit the 3.5mm jack, power switch, power cord, LED wiring and USB input.

I also sleeved all the LED wiring, and started mounting everything into the enclosure.

 

All that's left to do is to mount the MSGEQ7 board in the enclosure, solder up all the LED strips, and mount them into the diffusers.

 

I'll post a final update either tonight or tomorrow (hopefully with a video of it working!)

 

Photos (in a random order):

Spoiler

IMG-20190304-WA0005.thumb.jpeg.eb4eb1874fb47bb582dc1b87c4e58dee.jpeg

IMG_20190304_220133.thumb.jpg.ab796ef9775bf7487c9f1d1e01116242.jpg

IMG_20190304_211028.thumb.jpg.5c292a4e68d7520ea0fe451d3bd8b37a.jpg

IMG_20190304_210729.thumb.jpg.98069b3a2f15253a5496076a7eae763b.jpg

IMG_20190304_210720.thumb.jpg.4a09127a11177d837567168c51e4e6ec.jpg

IMG_20190304_205617.thumb.jpg.40db919a740580961ec542d59fba715d.jpg

IMG_20190304_205613.thumb.jpg.3f5ec8e47e90480fb3f33875a610a731.jpg

IMG_20190304_202602.thumb.jpg.5828e75c931bdba5331a47ae4133a9b9.jpg

IMG_20190304_200526.thumb.jpg.1b6295f291bc0076aee340e9d820af76.jpg

IMG_20190304_200519.thumb.jpg.0509caf4e0c9a15d957054de9adc6f57.jpg

IMG_20190304_192351.thumb.jpg.2d11e76f291b2bbb7c94724ed6ba85df.jpg

IMG_20190304_192349.thumb.jpg.4c0c73171eb1b0fffc0df1af8decfd24.jpg

 

Link to comment
Share on other sites

Link to post
Share on other sites

So after a few setbacks, it's finally done and mounted on the wall!

 

I'm really pleased with how it's turned out.

Had to change all my data wires over to something less stiff, but now they don't pull the pads off the strip.

 

Video of the finished product mounted on the wall here:

https://photos.app.goo.gl/1PmAuumD8c7UsFJf9

 

Some photos too:

Spoiler

The box all screwed together with everything mounted inside.

IMG_20190305_173914.thumb.jpg.f02f9b023aa63fa221e59c703c4d1812.jpg

 

Wraparound connections to go between strips.

IMG_20190305_190622.thumb.jpg.86fde7c3dca09e1cadc1443a388a75c6.jpg

 

The final power and data connections to the strips.

IMG_20190305_190633.thumb.jpg.ffb088620c3a24fe31be7871565bb5e6.jpg

 

All working! :)

IMG_20190305_214645.thumb.jpg.183bcfd3c28ee4b78b7ec962b56e5e98.jpg

 

Link to comment
Share on other sites

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×