I am trying to use addressable LED's to show various piano scales using the semi notes formula for each scale as an array and an input to indicate the starting note.
int MajorScale[] = {2,2,1,2,2,2,1}; //represents the semi notes in a major scale
int t= 8 //represents the led number that represent the first C on the keyboard
The following leds should light up -
(8, 8+2, 8+2+2, 8+2+2+1, 8+2+2+1+2, 8+2+2+1+2+2, 8+2+2+1+2+2+2 , 8+2+2+1+2+2+2+1) // This is first C Major Scale on the Piano
so.. (8,10,12,13,15,17,19) // This is first C Major Scale on the Piano where 8 is the first c
Then light up all the other C Major scales available on the piano limited by the number of keys on the piano in this case 76 keys
As there are 12 notes for each octave , add this to the array
if i take just the C note
8, 8+12, 8+12+12 ,8+12+12+12, 8+12+12+12+12 etc
My code so far just lights up the semitone that i set up in the array
enter code here
#include "FastLED.h"
#define DATA_PIN 5
#define NUM_LEDS 76
#define BRIGHTNESS 10
CRGB leds[NUM_LEDS];
int MajorScale[] = {2,2,1,2,2,2,1};
int delayValue = 1000;
void setup() {
Serial.begin(9600); // open the serial port at 9600 bps:
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
FastLED.clear();
}
void loop() {
for(int i = 0; i <=6; i++)
{
leds[MajorScale[i]] = CRGB::BlueViolet;
FastLED.show();
delay(delayValue);
}
FastLED.clear();
}
-
2And what is your question? What is the specific problem, that you have with coding the rest?chrisl– chrisl2019年11月11日 19:51:30 +00:00Commented Nov 11, 2019 at 19:51
-
How do i make this happen .. From the initial array {2,2,1,2,2,2,1} to the first set of LED lights (8,10,12,13,15,17,19) . I cannot visualize the formula that adds each element of the array to its next element. Feels like a running sum with an addition of a constantSubash– Subash2019年11月12日 14:25:28 +00:00Commented Nov 12, 2019 at 14:25
1 Answer 1
Your current code will not show all notes of a scale. Only the notes at 1 and 2 will light up, since you don't sum up the numbers, that you have stored in MajorScale
. But I think it is not a great idea to sum them up programatically, since this is a constant and you don't win much by representing the data this way. Instead you should directly initiate the MajorScale
variable with the summed up values:
int MajorScale[] = {0, 2, 4, 5, 7, 9, 11};
Then you can enclose your for loop with another for loop, that adds an offset corresponding to the octave:
for(int j=0; j<NUM_LEDS; j+=12){
for(int i=0; i<=6 && MajorScale[i]+j<NUM_LEDS;i++){
leds[8+MajorScale[i]+j] = CRGB::BlueViolet;
FastLED.show();
delay(delayvalue);
}
}
So we set the LED number 8+MajorScale[i]+j
. 8 for the offset to C, MajorScale[i]
as the position of the note in the current octave and j
for the offset of the current octave relative to the C.
Note, that this is not tested in any way.
-
A fear you forgot to sum the MajorScale values. e.g.
leds[MajorScale[ 0 ]+j] == leds[MajorScale[ 1 ]+j]
are pointing to the same LED. And must also be an poffset of6
for each j. IMHO ;-)Peter Paul Kiefer– Peter Paul Kiefer2019年11月12日 15:07:24 +00:00Commented Nov 12, 2019 at 15:07 -
Ah, you are right. I got that mixed in my head. I will change the answerchrisl– chrisl2019年11月12日 15:21:58 +00:00Commented Nov 12, 2019 at 15:21
-
As I saw the edit, I realized that I did also a mistake. The idea of modyfing the MajorScale array is better than the offset of 6 (good idea).. I was wrong when I said that each j needs an offset of 6 This first MajorScale starts at LED no 8 but the second scale starts with the next LED; I guess. So if the first C is at LED 8 start with
j=8
and add 0. The next LED is the D -> add 2 then E add 2 then F add 1 ... the next octave j++ the, 11}
must be removed because j++ jumps to the next octave C where you add 0. and so on. Sorry for this "for each". Party fail ;-)Peter Paul Kiefer– Peter Paul Kiefer2019年11月12日 15:50:57 +00:00Commented Nov 12, 2019 at 15:50 -
The position 11 corresponds to the B, which is still 1 half tone under the next octaves C. After that the number of i doesn't matter anymore, since the inner for loop wil exit. But I guess I should initialize
i
to zero in the for loop.chrisl– chrisl2019年11月12日 16:00:22 +00:00Commented Nov 12, 2019 at 16:00 -
If you've seen my last comment. I removed it because it was complete nonsense. You're right the code is correct.Peter Paul Kiefer– Peter Paul Kiefer2019年11月12日 16:21:05 +00:00Commented Nov 12, 2019 at 16:21