cck33
Published © MIT

150 Guitar Scales for Bangle.js 2

Access 150 guitar scales instantly on the Bangle.js 2 Smartwatch. Ideal for guitarists, it's a must-have with its always-on display.

BeginnerFull instructions provided1 hour112
150 Guitar Scales for Bangle.js 2

Things used in this project

Hardware components

Espruino Bangle.js 2
×1

Software apps and online services

Espruino Web IDE

Story

Read more

Schematics

GITHUB

Access 150 guitar scales instantly on the Bangle.js 2 Smartwatch. Ideal for guitarists, it's a must-have with its always-on display.

Code

guitar_scales.app.js

JavaScript
source code of the app
const stringInterval = 24;
const stringLength = 138;
const fretHeight = 35;
const xOffset = 26;
const yOffset = 29;
const notes = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"];
const tuning = ["E", "B", "G", "D", "A", "E"]; 
const scales = {
    "Major": ["E", "F#", "G#", "A", "B", "C#", "D#"],
    "Minor": ["E", "F#", "G", "A", "B", "C", "D"],
    "Pentatonic": ["E", "G", "A", "B", "D"],
    "Blues": ["E", "G", "A", "A#", "B", "D"],
    "Mixolydic": ["E", "F#", "G#", "A", "B", "C#", "D"],
    "Bebop Dominant": ["E", "F#", "G#", "A", "B", "C#", "D", "D#"],
    "Altered": ["E", "F", "G", "Ab", "Bb", "B", "Db"],
    "Ionian": ["E", "F#", "G#", "A", "B", "C#", "D#"],
    "Dorian": ["E", "F#", "G", "A", "B", "C#", "D"],
    "Phrygian": ["E", "F", "G", "A", "B", "C", "D"],
    "Lydian": ["E", "F#", "G#", "A#", "B", "C#", "D#"],
    "Mixolydian": ["E", "F#", "G#", "A", "B", "C#", "D"],
    "Aeolian": ["E", "F#", "G", "A", "B", "C", "D"],
    "Locrian": ["E", "F", "G", "A", "Bb", "C", "D"],
    "Whole Tone": ["E", "F#", "G#", "A#", "C", "D"],
    "Chromatic": ["E", "F", "F#", "G", "G#", "A", "A#", "B", "C", "C#", "D", "D#"],
    "Harmonic Minor": ["E", "F#", "G", "A", "B", "C", "D#"],
    "Harmonic Minor #5": ["E", "F#", "G", "A", "B", "C", "D#"],
    "Melodic Minor": ["E", "F#", "G", "A", "B", "C#", "D#"],
    "Dorian b2": ["E", "F", "G", "A", "B", "C#", "D"],
    "Lydian #5": ["E", "F#", "G#", "A#", "B", "C#", "D"],
    "Lydian Dominant": ["E", "F#", "G#", "A#", "B", "C#", "D"],
    "Phrygian Dominant": ["E", "F", "G#", "A", "B", "C", "D"],
    "Lydian b7": ["E", "F#", "G#", "A", "B", "C#", "D"],
    "Altered Dominant": ["E", "F", "G", "A", "Bb", "Cb", "Db"],
    "Half Diminished": ["E", "F#", "G", "A", "Bb", "C", "D"],
    "Diminished": ["E", "F", "G", "Ab", "Bb", "Cb", "Db"],
    "Whole Half Diminished": ["E", "F#", "G", "A", "Bb", "C", "D"],
    "Half Whole Diminished": ["E", "F", "G", "Ab", "Bb", "B", "C#", "D#"],
    "Augmented": ["E", "F#", "G#", "Bb"],
    "Augmented Heptatonic": ["E", "F#", "G#", "B"],
    "Hexatonic": ["E", "F#", "G#", "A#", "B", "D"],
    "In Sen": ["E", "F", "A", "B", "D"],
    "Istrian": ["E", "F#", "G", "B", "C"],
    "Marva": ["E", "F#", "G", "A", "B", "C"],
    "Shivranjani": ["E", "F#", "G#", "A", "B", "C#", "D#"],
    "Bhairav": ["E", "F#", "G", "A", "B", "C", "D"],
    "Bhairavi": ["E", "F", "G", "A", "B", "C", "D"],
    "Charukesi": ["E", "F#", "G#", "A", "B", "C#", "D"],
    "Kalyani": ["E", "F#", "G#", "A", "B", "C#", "D#"],
    "Kharaharapriya": ["E", "F#", "G#", "A", "B", "C", "D#"],
    "Mayamalavagowla": ["E", "F#", "G", "A", "B", "C", "D"],
    "Sankarabharanam": ["E", "F#", "G#", "A", "B", "C#", "D#"],
    "Bebop Locrian": ["E", "F", "G", "A", "Bb", "C", "D", "Db"],
    "Bebop Major": ["E", "F#", "G#", "A", "B", "C#", "D#", "D"],
    "Bebop Minor": ["E", "F#", "G", "A", "B", "C", "D", "D#"],
    "Blues Major": ["E", "F#", "G", "G#", "A", "B", "D"],
    "Diminished Whole Tone": ["E", "F", "G", "Ab", "A#", "C#", "D"],
    "Double Harmonic Major": ["E", "F", "G#", "A", "B", "C", "D#"],
    "Eight Tone Spanish": ["E", "F", "F#", "G#", "A", "B", "C#", "D#"],
    "Enigmatic Major": ["E", "F#", "G#", "A", "B", "C#", "D", "D#"],
    "Auxiliary Augmented": ["E", "F#", "G#", "B", "C#", "E"],
    "Auxiliary Diminished": ["E", "F#", "G#", "A#", "B", "C#", "E"],  
    "Auxiliary Diminished Blues": ["E", "F#", "G", "A", "C", "D#", "E"],
    "Spanish Gypsy": ["E", "F#", "G", "A#", "B", "C", "D#"],
    "Neapolitan Major Pentatonic": ["E", "F", "G#", "A#", "C#", "E"],
    "Neapolitan Minor Pentatonic": ["E", "F", "G#", "A", "C#", "E"],
    "Purvi Raga": ["E", "F#", "G", "A", "B", "C#", "D"],
    "Ganamurti": ["E", "F#", "G#", "A#", "B", "C#", "D"],
    "Zokuso": ["E", "F#", "G", "A", "Bb", "C#", "D"],
    "Raga Madhmad Sarang": ["E", "F#", "G", "A#", "B", "C#", "D"],
    "Raga Hameer": ["E", "F#", "G#", "A", "B", "C", "D#"],
    "Raga Pilu": ["E", "F#", "G", "A", "Bb", "C#", "D#"],
    "Leading Whole Tone": ["E", "F#", "G#", "A#", "C", "D", "E"],
    "Neapolitan Major": ["E", "F", "G#", "A", "B", "C#", "D#"],
    "Neapolitan Minor": ["E", "F", "G#", "A", "B", "C#", "D"],
    "Persian": ["E", "F", "G#", "A", "B", "C", "D"],
    "Prometheus": ["E", "F#", "G#", "B", "C#", "D#"],
    "Tritone": ["E", "G#", "A#", "C", "D", "F"],
    "Harmonic Major": ["E", "F#", "G#", "A", "B", "C", "D#"],
    "Double Harmonic Minor": ["E", "F", "G#", "A", "B", "C", "D#"],
    "Hungarian Minor": ["E", "F#", "G", "A#", "B", "C", "D#"],
    "Hungarian Major": ["E", "F#", "G#", "A#", "B", "C#", "D"],
    "Ukrainian Dorian": ["E", "F#", "G", "A", "B", "C#", "D#"],
    "Byzantine": ["E", "F", "G#", "A", "B", "C#", "D#"],
    "Egyptian": ["E", "F#", "G", "B", "D"],
    "Enigmatic Minor": ["E", "F", "G#", "A#", "B", "C#", "D#"],
    "Gypsy": ["E", "F#", "G", "A#", "B", "C", "D"],
    "Arabian": ["E", "F", "G", "A", "B", "C#", "D#"],
    "Algerian": ["E", "F#", "G#", "A", "B", "C#", "D"],
    "Balinese": ["E", "F#", "A", "B", "C", "E"],
    "Chinese": ["E", "F#", "G#", "B", "C#", "E"],
    "Hirajoshi": ["E", "F", "A", "B", "E"],
    "Iwato": ["E", "F", "Bb", "B", "Eb"],
    "Kumoi": ["E", "F", "A", "Bb", "D"],
    "Pelog": ["E", "F", "G", "Bb", "C"],
    "Prometheus Neapolitan": ["E", "F", "G#", "A", "B", "D", "D#"],
    "Romanian Minor": ["E", "F#", "G", "G#", "B", "C#", "D#"],
    "Japanese": ["E", "F", "G", "A", "C"],
    "Yo": ["E", "F", "A", "B", "D"],
    "Vietnamese": ["E", "F", "G#", "A", "B", "D", "E"],
    "Ritusen": ["E", "F", "A#", "C", "D"],
    "Lydian Minor": ["E", "F#", "G#", "A#", "B", "C", "D"],
    "Lydian Augmented": ["E", "F#", "G#", "A#", "B", "C#", "D#"],
    "Acoustic": ["E", "F#", "G#", "A", "B", "C#", "D#"],
    "Altered Dominant bb7": ["E", "F", "G", "A", "Bb", "C", "D"],
    "Augmented Major": ["E", "F#", "G#", "A#", "C", "D", "E"],
    "Bebop": ["E", "F#", "G#", "A", "B", "C#", "D#", "D"],
    "Bebop Dominant Locrian": ["E", "F", "G", "A", "Bb", "C", "D", "D#"],
    "Bebop Major Locrian": ["E", "F#", "G#", "A", "B", "C#", "D#", "D"],
    "Blues Minor": ["E", "G", "A", "A#", "B", "D"],
    "Blues Phrygian": ["E", "G", "A", "Bb", "B", "D"],
    "Chromatic Mixolydian": ["E", "F#", "G#", "A", "B", "C#", "D"],
    "Dorian b5": ["E", "F#", "G", "Ab", "B", "C#", "D"],
    "Dorian b9": ["E", "F", "G", "A", "Bb", "C#", "D"],
    "Dorian #11": ["E", "F#", "G", "A", "B", "C#", "D"],
    "Dorian #4": ["E", "F#", "G", "A#", "B", "C#", "D"],
    "Dorian #9": ["E", "F#", "G", "A", "B", "C#", "D"],
    "Double Harmonic": ["E", "F", "G#", "A", "B", "C", "D#"],
    "Half Diminished Whole Tone": ["E", "F#", "G", "A", "Bb", "C#", "D"],
    "Half Whole Mixolydian": ["E", "F", "G", "Ab", "Bb", "C", "D"],
    "Hungarian Gypsy": ["E", "F#", "G", "A#", "B", "C", "D#"],
    "Hungarian Major Pentatonic": ["E", "F#", "G#", "A#", "C#", "E"],
    "In": ["E", "F", "A", "Bb", "D"],
    "Ionian Augmented": ["E", "F#", "G#", "A#", "B", "C#", "D#"],
    "Ionian Augmented #2": ["E", "F#", "G#", "B", "C#", "D#", "D"],
    "Ionian b2": ["E", "F", "G#", "A", "B", "C#", "D#"],
    "Ionian b5": ["E", "F#", "G#", "A#", "B", "C", "D#"],
    "Ionian #5": ["E", "F#", "G#", "A#", "B", "C#", "D"],
    "Ionian #5 #7": ["E", "F#", "G#", "A#", "B", "D", "D#"],
    "Ionian #5 b6": ["E", "F#", "G#", "A#", "B", "C", "D"],
    "Ionian #5 b6 b7": ["E", "F#", "G#", "A#", "B", "C", "D#"],
    "Ionian #5 b7": ["E", "F#", "G#", "A#", "B", "C#", "D"],
    "Ionian #5 b7 #7": ["E", "F#", "G#", "A#", "B", "C#", "D#"],
    "Ionian b6": ["E", "F#", "G#", "A", "B", "C#", "D#"],
    "Ionian b7": ["E", "F#", "G#", "A", "B", "C#", "D"],
    "Japanese (Pentatonic)": ["E", "F", "A", "B", "D"],
    "Kafi": ["E", "F#", "G#", "A#", "B"],
    "Kafi (Pentatonic)": ["E", "F#", "A", "B", "D"],
    "Kumoi (Pentatonic)": ["E", "F", "A", "Bb", "D"],
    "Lydian Augmented #2": ["E", "F#", "G#", "A#", "C", "D#", "D"],
    "Lydian Augmented #9": ["E", "F#", "G#", "A#", "B", "C#", "D"],
    "Lydian b3": ["E", "F#", "G#", "B", "C#", "D#", "D"],
    "Lydian b7 P5": ["E", "F#", "G#", "A#", "B", "C#", "D"],
    "Lydian Diminished": ["E", "F#", "G#", "A#", "B", "C", "D"],
    "Lydian Dominant b7": ["E", "F#", "G#", "A#", "B", "C#", "D"],
    "Lydian Pentatonic": ["E", "F#", "G#", "B", "C#", "E"],
    "Melodic Minor b2": ["E", "F", "G", "A", "B", "C#", "D#"],
    "Melodic Minor b4": ["E", "F#", "G", "A", "B", "C#", "D#"],
    "Melodic Minor b6": ["E", "F#", "G#", "A#", "B", "C#", "D"],
    "Melodic Minor #5": ["E", "F#", "G#", "A#", "B", "C", "D"],
    "Persian (Pentatonic)": ["E", "F", "A", "B", "D"],
    "Phrygian Diminished": ["E", "F", "G", "A", "Bb", "C", "D"],
    "Roumanian Minor": ["E", "F#", "G", "G#", "B", "C#", "D#"],
    "Scriabin": ["E", "F#", "A", "B", "C#", "E"],
    "Spanish": ["E", "F#", "G", "A", "B", "C", "D#"],
    "Todi": ["E", "F#", "G", "A#", "B", "C#", "D"],
    "Whole Tone Diminished": ["E", "F#", "G#", "Bb", "C", "D", "D#"],
    "Whole Tone Pentatonic": ["E", "F#", "G#", "Bb", "C#", "E"],
    "Yo (Pentatonic)": ["E", "F", "A", "B", "D"],
    "Yonanuki": ["E", "F", "A#", "B", "C", "E"]
};

function createFretboardMatrix() {
    const fretsPerString = 5;
    let matrix = [];

    for (let string = 0; string < tuning.length; string++) {
        matrix[string] = [];
        let noteIndex = notes.indexOf(tuning[string]);
        for (let fret = 0; fret <= fretsPerString; fret++) {
            matrix[string][fret] = notes[(noteIndex + fret) % notes.length];
        }
    }

    return matrix.reverse();
}

function markScaleNotesOnFretboard(scaleNotes, fretboard) {
    let markedFretboard = JSON.parse(JSON.stringify(fretboard));

    for (let string = 0; string < fretboard.length; string++) {
        for (let fret = 0; fret < fretboard[string].length; fret++) {
            markedFretboard[string][fret] = scaleNotes.includes(fretboard[string][fret]) ? "X" : " ";
        }
    }

    return markedFretboard;
}

function drawBase() {
    g.clear();
    for (let i = 0; i < 6; i++) {
        g.drawLine(xOffset + i * stringInterval, yOffset, xOffset + i * stringInterval, yOffset + stringLength);
    }
    for (let i = 0; i <= 5; i++) {
        g.drawLine(xOffset, yOffset + i * fretHeight, xOffset + 5 * stringInterval, yOffset + i * fretHeight);
    }
}


function drawScaleName(scaleName) {
    g.setFontAlign(0, 0);
    let scaleFontSize = 2;
    const maxScaleNameLength = 14;
    if (scaleName.length > maxScaleNameLength) {
        scaleFontSize = Math.floor(maxScaleNameLength / scaleName.length * scaleFontSize);
    }
    g.setFont("6x8", scaleFontSize);
    g.drawString(scaleName, g.getWidth() / 2, 15);
    g.drawLine(0, 22, g.getWidth(), 22);
}

function drawMarkedFretboard(markedFretboard, scaleName) {
    drawBase();
    drawScaleName(scaleName);
    for (let string = 0; string < markedFretboard.length; string++) {
        for (let fret = 0; fret < markedFretboard[string].length; fret++) {
            if (markedFretboard[string][fret] === "X") {
                let stringPos = xOffset + string * stringInterval;
                let yPos = yOffset + fret * fretHeight;
                g.fillCircle(stringPos, yPos, 5);
            }
        }
    }
}

function generateMenu() {
    let menu = { "": { "title": "Guitar Scales" } };
    Object.keys(scales).forEach(scale => {
        menu[scale] = () => {
            const fretboard = createFretboardMatrix();
            const scaleNotes = scales[scale];
            const markedFretboard = markScaleNotesOnFretboard(scaleNotes, fretboard);
            drawMarkedFretboard(markedFretboard, scale); 
        };
    });
    return menu;
}


function main() {
    E.showMenu(generateMenu());
}

main();

guitar_scales.info

JavaScript
You need it to create the app in the Espruino IDE
require("Storage").write("guitar_scales.info", {
  "id": "guitar_scales.app",
  "name": "Git.-Scales",
  "src": "guitar_scales.app.js",
  "icon": "guitar_scales.img",
  "type": "app",
});

Guitar Scales

Access 150 guitar scales instantly on the Bangle.js 2 Smartwatch. Ideal for guitarists, it's a must-have with its always-on display.

Credits

cck33

cck33

3 projects • 0 followers

Comments