'Reworking to make octave changeable every note
'26,17
SCREEN 12
DIM song(100, 100)
DIM octave(1000)
DIM notes$(12)
DIM NLS(3)
FOR a = 1 TO 100
    FOR b = 1 TO 100
        song(a, b) = 0
    NEXT b
NEXT a
FOR i = 1 TO 50
    octave(i) = 2
NEXT i
FOR i = 1 TO 3
    NLS(i) = 0
NEXT i
NLS(2) = 1

'assigning notes
notes$(1) = "C"
notes$(2) = "C#"
notes$(3) = "D"
notes$(4) = "D#"
notes$(5) = "E"
notes$(6) = "F"
notes$(7) = "F#"
notes$(8) = "G"
notes$(9) = "G#"
notes$(10) = "A"
notes$(11) = "A#"
notes$(12) = "B"
'mouse on window
_MOUSEMOVE 100, 100

'menu
menu:
CLS
PRINT
PRINT
PRINT
PRINT
PRINT
PRINT TAB(36); "Melody"
PRINT
PRINT
PRINT
PRINT TAB(36); "Creator"
PRINT
PRINT
PRINT
PRINT
PRINT
PRINT "  Editor"
PRINT
PRINT
PRINT "  Help"
PRINT
PRINT
PRINT "  Quit"
PRINT
PRINT
CIRCLE (305, 120), 24, 15
CIRCLE (305, 120), 23, 15
LINE (328, 120)-(329, 20), 15, BF
CIRCLE (400, 300), 20, 15
CIRCLE (500, 275), 20, 15
LINE (420, 300)-(420, 200), 15
LINE (520, 275)-(520, 175), 15
LINE -(420, 200), 15
LINE (420, 220)-(520, 195), 15
CIRCLE (100, 100), 20, 15
LINE (120, 100)-(120, 25), 15
DO
    IF _MOUSEINPUT THEN
        mx = _MOUSEX
        my = _MOUSEY
        mx = INT(mx / 8) + 1
        my = INT(my / 16) + 1
        IF _MOUSEBUTTON(1) AND my = 16 AND (mx >= 3 AND mx <= 8) THEN
            GOTO editor
        ELSEIF _MOUSEBUTTON(1) AND my = 19 AND (mx >= 3 AND mx <= 6) THEN
            GOTO help
        ELSEIF _MOUSEBUTTON(1) AND my = 22 AND (mx >= 3 AND mx <= 6) THEN
            END
        END IF
    END IF
LOOP

help:
CLS
PRINT
PRINT
PRINT "Welcome to the Melody Creator! This a program where you can create melodies."
PRINT "To start, click on the 'Editor' button, or click 'Quit' to exit the program."
PRINT "Within the editor you can click the -'s and #'s to toggle notes on and off."
PRINT "A - means a note is off, and a # means a note is on."
PRINT "Down at the bottom there's a section labled 'Oct.' This stands for octave."
PRINT "Click the arrows at the top and bottom to increase or decrease the octave."
PRINT "Below the octave section is 's N l.'"
PRINT "This stands for stacatto, normal note length, and legatto."
PRINT "These buttons change the length of notes."
PRINT "Finally is the play button, click this button to play the melody."
PRINT "There is also the Save and Load buttons which can save, and load, melodies."
PRINT "Simply give them the path towards a place to save, or load, a melody."
PRINT
PRINT
PRINT
PRINT "Back to Main Menu"
DO
    IF _MOUSEINPUT THEN
        mx = _MOUSEX
        my = _MOUSEY
        mx = INT(mx / 8) + 1
        my = INT(my / 16) + 1
        IF _MOUSEBUTTON(1) AND my = 18 AND (mx >= 1 AND mx <= 18) THEN
            GOTO menu
        END IF
    END IF
LOOP

' UI
editor:
CLS
PRINT "              11111111112222222222333333333344444444445"
PRINT "     12345678901234567890123456789012345678901234567890"
PRINT "________________________________________________________"
PRINT " C | --------------------------------------------------|"
PRINT " C#| --------------------------------------------------|"
PRINT " D | --------------------------------------------------|"
PRINT " D#| --------------------------------------------------|"
PRINT " E | --------------------------------------------------|"
PRINT " F | --------------------------------------------------|"
PRINT " F#| --------------------------------------------------|"
PRINT " G | --------------------------------------------------|"
PRINT " G#| --------------------------------------------------|"
PRINT " A | --------------------------------------------------|"
PRINT " A#| --------------------------------------------------|"
PRINT " B | --------------------------------------------------|"
PRINT "_______________________________________________________|"
PRINT "Oct| |"
PRINT "   | 22222222222222222222222222222222222222222222222222|"
PRINT "   | |"
PRINT "________________________________________________________"
PRINT " s N l"
PRINT " Play"
PRINT " Save"
PRINT " Load"
PRINT
PRINT "Back to Main Menu"
FOR i = 1 TO 50
    FOR j = 1 TO 12
        IF song(i, j) = 1 THEN
            LOCATE j + 3, 5 + i
            PRINT "#"
        END IF
    NEXT j
NEXT i
FOR i = 1 TO 50
    LOCATE 18, 5 + i
    PRINT RIGHT$(STR$(octave(i)), 1)
NEXT i
IF NLS(1) = 1 THEN
    LOCATE 21, 2
    PRINT "S n l"
ELSEIF NLS(2) = 1 THEN
    LOCATE 21, 2
    PRINT "s N l"
ELSEIF NLS(3) = 1 THEN
    LOCATE 21, 2
    PRINT "s n L"
END IF
DO
    'mouse tracking
    IF _MOUSEINPUT THEN
        mx = _MOUSEX
        my = _MOUSEY
        mx = INT(mx / 8) + 1
        my = INT(my / 16) + 1
        'LOCATE 25, 1
        'PRINT mx, my
        'LOCATE 26
        'PRINT octave(1), octave(2), octave(3)
        'PRINT octave(23), octave(24), octave(25)
        'Note Chooser
        IF _MOUSEBUTTON(1) AND (my > 3 AND my < 16) AND (mx > 5 AND mx < 56) THEN
            IF song(mx - 5, my - 3) = 0 THEN
                LOCATE my, mx
                PRINT "#"
                song(mx - 5, my - 3) = 1
            ELSEIF song(mx - 5, my - 3) = 1 THEN
                LOCATE my, mx
                PRINT "-"
                song(mx - 5, my - 3) = 0
            END IF
            'octave up
        ELSEIF _MOUSEBUTTON(1) AND my = 17 AND (mx > 5 AND mx < 56) AND timerlast <> TIMER THEN
            IF octave(mx - 5) < 6 THEN
                octave(mx - 5) = octave(mx - 5) + 1
                LOCATE 18, mx
                PRINT RIGHT$(STR$(octave(mx - 5)), 1)
                timerlast = TIMER
            END IF
            'octave down
        ELSEIF _MOUSEBUTTON(1) AND my = 19 AND (mx > 5 AND mx < 56) AND timerlast <> TIMER THEN
            IF octave(mx - 5) > 0 THEN
                octave(mx - 5) = octave(mx - 5) - 1
                LOCATE 18, mx
                PRINT RIGHT$(STR$(octave(mx - 5)), 1)
                timerlast = TIMER
            END IF
        ELSEIF _MOUSEBUTTON(1) AND my = 21 THEN
            'Staccato
            IF mx = 2 THEN
                FOR i = 1 TO 3
                    NLS(i) = 0
                NEXT i
                NLS(1) = 1
                LOCATE 21, 2
                PRINT "S n l"
                'Normal
            ELSEIF mx = 4 THEN
                FOR i = 1 TO 3
                    NLS(i) = 0
                NEXT i
                NLS(2) = 1
                LOCATE 21, 2
                PRINT "s N l"
                'Legato
            ELSEIF mx = 6 THEN
                FOR i = 1 TO 3
                    NLS(i) = 0
                NEXT i
                NLS(3) = 1
                LOCATE 21, 2
                PRINT "s n L"
            END IF
            'play song
        ELSEIF _MOUSEBUTTON(1) AND my = 22 AND (mx >= 2 AND mx <= 5) THEN
            'LOCATE 30, 1
            'PRINT "test"
            symbols$ = stringy$ + "V25 MB "
            'Note Length
            IF NLS(1) = 1 THEN
                symbols$ = symbols$ + " MS"
            ELSEIF NLS(2) = 1 THEN
            ELSEIF NLS(3) = 1 THEN
                symbols$ = symbols$ + " ML"
            END IF
            total = 0
            FOR i = 1 TO 50
                symbols$ = symbols$ + " O" + RIGHT$(STR$(octave(i)), 1) + " "
                'LOCATE 24, i
                ' PRINT RIGHT$(STR$(octave(i)), 1)
                FOR j = 1 TO 12
                    IF song(i, j) = 1 AND thing = 1 THEN
                        symbols$ = symbols$ + ", " + notes$(j)
                    ELSEIF song(i, j) = 1 AND thing = 0 THEN
                        symbols$ = symbols$ + " " + notes$(j)
                        thing = 1
                    ELSE
                        total = total + 1
                    END IF
                NEXT j
                IF total / 12 = 1 THEN
                    symbols$ = symbols$ + " P4"
                END IF
                total = 0
                thing = 0
            NEXT i
            PLAY symbols$
            ' LOCATE 29, 1
            'PRINT symbols$
            'PRINT stringy$
            'PRINT octave

            'save
        ELSEIF _MOUSEBUTTON(1) AND my = 23 AND (mx >= 2 AND mx <= 5) AND NOT toiming = TIMER THEN
            toiming = TIMER
            GOTO save
            'load
        ELSEIF _MOUSEBUTTON(1) AND my = 24 AND (mx >= 2 AND mx <= 5) AND NOT toiming = TIMER THEN
            toiming = TIMER
            GOTO load
            'back to menu
        ELSEIF _MOUSEBUTTON(1) AND my = 26 AND (mx >= 1 AND mx <= 18) THEN
            GOTO menu
        END IF
    END IF
LOOP

save:
CLS
PRINT
PRINT
PRINT
PRINT " ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"
PRINT " ³ Enter A Path To Save The File Or Type 'Cancel' 3x To Go Back:            ³"
PRINT " ³                                                                          ³"
PRINT " ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"
LOCATE 6, 4
INPUT "", path$
IF LCASE$(path$) = "cancel" THEN
    GOTO editor
ELSEIF NOT (RIGHT$(path$, 4) = ".txt" OR RIGHT$(path$, 4) = ".dat") THEN
    CLS
    PRINT "Please enter a valid path. "
    PRINT "You should be pointing to a valid folder, and then end with a valid file."
    PRINT "A valid file ends with .dat or .txt."
    PRINT
    PRINT "Press Any Key To Continue"
    WHILE INKEY$ = ""
    WEND
    GOTO save
END IF
OPEN path$ FOR OUTPUT AS #1
FOR i = 1 TO 50
    FOR j = 1 TO 12
        PRINT #1, song(i, j);
    NEXT j
    PRINT #1, ,
NEXT i
FOR i = 1 TO 50
    PRINT #1, octave(i);
NEXT i
PRINT #1, ,
FOR i = 1 TO 3
    PRINT #1, NLS(i);
NEXT i
CLOSE #1
GOTO editor

load:
CLS
PRINT
PRINT
PRINT
PRINT " ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"
PRINT " ³ Enter A Path To Load The File Or Type 'Cancel' 3x To Go Back:            ³"
PRINT " ³                                                                          ³"
PRINT " ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"
LOCATE 6, 4
INPUT "", path$
IF LCASE$(path$) = "cancel" THEN
    GOTO editor
ELSEIF NOT (RIGHT$(path$, 4) = ".txt" OR RIGHT$(path$, 4) = ".dat") THEN
    CLS
    PRINT "Please enter a valid path. "
    PRINT "You should be pointing to a valid folder, and then end with a valid file."
    PRINT "A valid file ends with .dat or .txt."
    PRINT
    PRINT "Press Any Key To Continue"
    WHILE INKEY$ = ""
    WEND
    GOTO save
END IF
OPEN path$ FOR INPUT AS #1
FOR i = 1 TO 50
    FOR j = 1 TO 12
        INPUT #1, song(i, j)
    NEXT j
NEXT i
FOR i = 1 TO 50
    INPUT #1, octave(i)
NEXT i
FOR i = 1 TO 3
    INPUT #1, NLS(i)
NEXT i
CLOSE #1
GOTO editor
