Code Sketch


sattyaprakash piano
By: Mhalsakant School
Category: Art
cleari()

// =====================================================
//              VIRTUAL PIANO - KOJO
// =====================================================

// Background
setBackground(ColorMaker.hsl(220, 0.35, 0.12))

// -----------------------------------------------------
// Piano sound files
// -----------------------------------------------------

val pianoURL = "https://gleitz.github.io/midi-js-soundfonts/FluidR3_GM/acoustic_grand_piano-mp3/"

preloadMp3(pianoURL + "C4.mp3")
preloadMp3(pianoURL + "D4.mp3")
preloadMp3(pianoURL + "E4.mp3")
preloadMp3(pianoURL + "F4.mp3")
preloadMp3(pianoURL + "G4.mp3")
preloadMp3(pianoURL + "A4.mp3")
preloadMp3(pianoURL + "B4.mp3")
preloadMp3(pianoURL + "C5.mp3")

preloadMp3(pianoURL + "Cs4.mp3")
preloadMp3(pianoURL + "Ds4.mp3")
preloadMp3(pianoURL + "Fs4.mp3")
preloadMp3(pianoURL + "Gs4.mp3")
preloadMp3(pianoURL + "As4.mp3")


// -----------------------------------------------------
// Title
// -----------------------------------------------------

val title = Picture {
    setPenColor(white)
    setPenFontSize(35)
    write("VIRTUAL PIANO")
}

title.setPosition(-170, 250)
draw(title)


// -----------------------------------------------------
// Subtitle
// -----------------------------------------------------

val subtitle = Picture {
    setPenColor(ColorMaker.hsl(200, 0.7, 0.8))
    setPenFontSize(16)
    write("Click the keys to play music")
}

subtitle.setPosition(-150, 215)
draw(subtitle)


// =====================================================
//                 WHITE KEYS
// =====================================================

val keyWidth = 65
val keyHeight = 230

val startX = -260
val startY = -100


// -----------------------------------------------------
// C4
// -----------------------------------------------------

val C4 = Picture {
    setPenColor(black)
    setPenThickness(3)
    setFillColor(white)

    repeat(2) {
        forward(keyHeight)
        right(90)
        forward(keyWidth)
        right(90)
    }

    setPosition(10, 20)
    setPenColor(black)
    setPenFontSize(18)
    write("C")
}

C4.setPosition(startX, startY)
draw(C4)

C4.onMouseClick { (x, y) =>
    playMp3(pianoURL + "C4.mp3")
}


// -----------------------------------------------------
// D4
// -----------------------------------------------------

val D4 = Picture {
    setPenColor(black)
    setPenThickness(3)
    setFillColor(white)

    repeat(2) {
        forward(keyHeight)
        right(90)
        forward(keyWidth)
        right(90)
    }

    setPosition(10, 20)
    setPenColor(black)
    setPenFontSize(18)
    write("D")
}

D4.setPosition(startX + 65, startY)
draw(D4)

D4.onMouseClick { (x, y) =>
    playMp3(pianoURL + "D4.mp3")
}


// -----------------------------------------------------
// E4
// -----------------------------------------------------

val E4 = Picture {
    setPenColor(black)
    setPenThickness(3)
    setFillColor(white)

    repeat(2) {
        forward(keyHeight)
        right(90)
        forward(keyWidth)
        right(90)
    }

    setPosition(10, 20)
    setPenColor(black)
    setPenFontSize(18)
    write("E")
}

E4.setPosition(startX + 130, startY)
draw(E4)

E4.onMouseClick { (x, y) =>
    playMp3(pianoURL + "E4.mp3")
}


// -----------------------------------------------------
// F4
// -----------------------------------------------------

val F4 = Picture {
    setPenColor(black)
    setPenThickness(3)
    setFillColor(white)

    repeat(2) {
        forward(keyHeight)
        right(90)
        forward(keyWidth)
        right(90)
    }

    setPosition(10, 20)
    setPenColor(black)
    setPenFontSize(18)
    write("F")
}

F4.setPosition(startX + 195, startY)
draw(F4)

F4.onMouseClick { (x, y) =>
    playMp3(pianoURL + "F4.mp3")
}


// -----------------------------------------------------
// G4
// -----------------------------------------------------

val G4 = Picture {
    setPenColor(black)
    setPenThickness(3)
    setFillColor(white)

    repeat(2) {
        forward(keyHeight)
        right(90)
        forward(keyWidth)
        right(90)
    }

    setPosition(10, 20)
    setPenColor(black)
    setPenFontSize(18)
    write("G")
}

G4.setPosition(startX + 260, startY)
draw(G4)

G4.onMouseClick { (x, y) =>
    playMp3(pianoURL + "G4.mp3")
}


// -----------------------------------------------------
// A4
// -----------------------------------------------------

val A4 = Picture {
    setPenColor(black)
    setPenThickness(3)
    setFillColor(white)

    repeat(2) {
        forward(keyHeight)
        right(90)
        forward(keyWidth)
        right(90)
    }

    setPosition(10, 20)
    setPenColor(black)
    setPenFontSize(18)
    write("A")
}

A4.setPosition(startX + 325, startY)
draw(A4)

A4.onMouseClick { (x, y) =>
    playMp3(pianoURL + "A4.mp3")
}


// -----------------------------------------------------
// B4
// -----------------------------------------------------

val B4 = Picture {
    setPenColor(black)
    setPenThickness(3)
    setFillColor(white)

    repeat(2) {
        forward(keyHeight)
        right(90)
        forward(keyWidth)
        right(90)
    }

    setPosition(10, 20)
    setPenColor(black)
    setPenFontSize(18)
    write("B")
}

B4.setPosition(startX + 390, startY)
draw(B4)

B4.onMouseClick { (x, y) =>
    playMp3(pianoURL + "B4.mp3")
}


// -----------------------------------------------------
// C5
// -----------------------------------------------------

val C5 = Picture {
    setPenColor(black)
    setPenThickness(3)
    setFillColor(white)

    repeat(2) {
        forward(keyHeight)
        right(90)
        forward(keyWidth)
        right(90)
    }

    setPosition(10, 20)
    setPenColor(black)
    setPenFontSize(18)
    write("C")
}

C5.setPosition(startX + 455, startY)
draw(C5)

C5.onMouseClick { (x, y) =>
    playMp3(pianoURL + "C5.mp3")
}


// =====================================================
//                 BLACK KEYS
// =====================================================

val blackWidth = 40
val blackHeight = 140


// -----------------------------------------------------
// C#4
// -----------------------------------------------------

val Cs4 = Picture {
    setPenColor(black)
    setPenThickness(2)
    setFillColor(ColorMaker.hsl(0, 0, 0.08))

    repeat(2) {
        forward(blackHeight)
        right(90)
        forward(blackWidth)
        right(90)
    }

    setPosition(7, 20)
    setPenColor(white)
    setPenFontSize(14)
    write("C#")
}

Cs4.setPosition(startX + 42, startY + 90)
draw(Cs4)

Cs4.onMouseClick { (x, y) =>
    playMp3(pianoURL + "Cs4.mp3")
}


// -----------------------------------------------------
// D#4
// -----------------------------------------------------

val Ds4 = Picture {
    setPenColor(black)
    setPenThickness(2)
    setFillColor(ColorMaker.hsl(0, 0, 0.08))

    repeat(2) {
        forward(blackHeight)
        right(90)
        forward(blackWidth)
        right(90)
    }

    setPosition(7, 20)
    setPenColor(white)
    setPenFontSize(14)
    write("D#")
}

Ds4.setPosition(startX + 107, startY + 90)
draw(Ds4)

Ds4.onMouseClick { (x, y) =>
    playMp3(pianoURL + "Ds4.mp3")
}


// -----------------------------------------------------
// F#4
// -----------------------------------------------------

val Fs4 = Picture {
    setPenColor(black)
    setPenThickness(2)
    setFillColor(ColorMaker.hsl(0, 0, 0.08))

    repeat(2) {
        forward(blackHeight)
        right(90)
        forward(blackWidth)
        right(90)
    }

    setPosition(7, 20)
    setPenColor(white)
    setPenFontSize(14)
    write("F#")
}

Fs4.setPosition(startX + 237, startY + 90)
draw(Fs4)

Fs4.onMouseClick { (x, y) =>
    playMp3(pianoURL + "Fs4.mp3")
}


// -----------------------------------------------------
// G#4
// -----------------------------------------------------

val Gs4 = Picture {
    setPenColor(black)
    setPenThickness(2)
    setFillColor(ColorMaker.hsl(0, 0, 0.08))

    repeat(2) {
        forward(blackHeight)
        right(90)
        forward(blackWidth)
        right(90)
    }

    setPosition(7, 20)
    setPenColor(white)
    setPenFontSize(14)
    write("G#")
}

Gs4.setPosition(startX + 302, startY + 90)
draw(Gs4)

Gs4.onMouseClick { (x, y) =>
    playMp3(pianoURL + "Gs4.mp3")
}


// -----------------------------------------------------
// A#4
// -----------------------------------------------------

val As4 = Picture {
    setPenColor(black)
    setPenThickness(2)
    setFillColor(ColorMaker.hsl(0, 0, 0.08))

    repeat(2) {
        forward(blackHeight)
        right(90)
        forward(blackWidth)
        right(90)
    }

    setPosition(7, 20)
    setPenColor(white)
    setPenFontSize(14)
    write("A#")
}

As4.setPosition(startX + 367, startY + 90)
draw(As4)

As4.onMouseClick { (x, y) =>
    playMp3(pianoURL + "As4.mp3")
}


// =====================================================
//               INFORMATION PANEL
// =====================================================

val info = Picture {
    setPenColor(ColorMaker.hsl(45, 0.9, 0.7))
    setPenFontSize(15)
    write("C  D  E  F  G  A  B  C")
}

info.setPosition(-145, -150)
draw(info)


// -----------------------------------------------------
// Keyboard hint
// -----------------------------------------------------

val hint = Picture {
    setPenColor(ColorMaker.hsl(200, 0.5, 0.8))
    setPenFontSize(13)
    write("Click any piano key to play its sound")
}

hint.setPosition(-150, -190)
draw(hint)


// =====================================================
//                    END
// =====================================================

println("======================================")
println("          VIRTUAL PIANO")
println("======================================")
println("Click the piano keys to play.")
println("White keys : C D E F G A B C")
println("Black keys : C# D# F# G# A#")
println("======================================")