'==========================================================================
'
'   Titre du programmme : TEMPO, M‚tronome ‚lectronique
'                Auteur : R‚al Dolbec,
'                         Trois-RiviŠres, Qc.
'               Langage : QuickBASIC 4,5
'    Genre d'ordinateur : IBM et ses compatibles
'
'                  Date : 30 octobre 1989
'               Version : 1.00
'           
'   Fonctionnement : Le m‚tronome ‚lectronique fonctionne … partir des
'                    flŠches du clavier. Les flŠches gauche et droite fait
'                    varier le tempo. Les flŠches haut et bas donne le choix
'                    de la mesure (1 temps, 2 temps, 3 temps).
'                    Il est pr‚f‚rable de faire son choix … l'aide des
'                    flŠches lorsque le son est hors fonction. C'est plus
'                    rapide. Appuyez sur la barre d'espacement pour actionner
'                    le son.
'
'   Adaptation     : J'ai puis‚ l'id‚e de ce m‚tronome dans la Revue PCM
'                    du Mois d'Avril 89 (page 25). Ce programme est ‚crit en
'                    GW-BASIC exclusif aux Tandy 1000. Il fait varier le
'                    volume et le tempo. J'ai modifi‚ de beaucoup la struc-
'                    ture de programmation.
'
'==========================================================================

'D‚clarations des sous-routines
   
    DECLARE SUB AfficheTempo ()
    DECLARE SUB Initialisation ()
    DECLARE SUB AfficheOnOff ()
    DECLARE SUB CalculeTempo ()
    DECLARE SUB DessineEcran ()
    DECLARE SUB AfficheMesure ()
    DECLARE SUB VerifieMesure ()
    DECLARE SUB PresentationLogiciel ()

' Autres d‚clarations

CONST ESC = 27, Espace = 32, Silence = 32767

CONST Bleue = 1, Vert = 2, Cyan = 3, rouge = 4, Gris = 7, VertPale = 10
CONST CyanPale = 11, RougePale = 12, MagentaPale = 13, Jaune = 14, Blanc = 15

DIM SHARED Mesure$(6), Tempo$(8), NoMesure$(6)

COMMON SHARED NbrMesure, AncienNbrMesure, Tic, Tempo, AncienTempo
COMMON SHARED DureeSilence, Delta, Touche, NouveauTempo

SCREEN 0: COLOR Cyan, Bleue

Initialisation

' PROGRAMME PRINCIPAL (TIC=1=ON, TIC=-1=OFF)

DO
    DO
        IF Tic = 1 THEN
           
            COLOR Blanc: LOCATE 17, 5: PRINT CHR$(14): SOUND 750, .6
            LOCATE 17, 5: PRINT " "
            SOUND Silence, DureeSilence: COLOR Cyan
           
            FOR Compteur = 1 TO NbrMesure - 1
                COLOR Blanc: LOCATE 17, 5: PRINT CHR$(14): SOUND 400, .6
                LOCATE 17, 5: PRINT " "
                SOUND Silence, DureeSilence: COLOR Cyan
            NEXT
       
        END IF
        Touche$ = INKEY$
    LOOP UNTIL Touche$ <> ""

    Touche = ASC(RIGHT$(Touche$, 1)): '(pour la touche des curseurs)

    SELECT CASE Touche
        CASE 75
            CalculeTempo          ' (Curseur gauche)
        CASE 77
            CalculeTempo          ' (Curseur droit)
        CASE 72
            VerifieMesure         ' (Curseur vers le haut)
        CASE 80
            VerifieMesure         ' (Curseur vers le bas)
        CASE Espace
            AfficheOnOff          ' (Barre d'espacement)
    END SELECT

LOOP UNTIL Touche = ESC

CLS

END
'============================================================================
'
'                             LES SOUS - ROUTINES
'

'==========================================================================
'
SUB AfficheMesure

     ' (AFFICHE NOUVELLE MESURE)
     COLOR RougePale: LOCATE 20 - NbrMesure, 26: PRINT "Û": 'CHR$(219)
     COLOR Jaune: LOCATE 20 - NbrMesure, 22: PRINT NoMesure$(NbrMesure)
     COLOR CyanPale: LOCATE 20 - NbrMesure, 28: PRINT Mesure$(NbrMesure)
    
     IF AncienNbrMesure > NbrMesure THEN
        ' (ENLEVE L'ANCIENNE MESURE)
        COLOR Bleue
        LOCATE 20 - AncienNbrMesure, 26
            PRINT "Û": 'CHR$(219)
     END IF
       
     COLOR Cyan
     LOCATE 20 - AncienNbrMesure, 22
        PRINT NoMesure$(AncienNbrMesure)
     LOCATE 20 - AncienNbrMesure, 28
        PRINT Mesure$(AncienNbrMesure)
     AncienNbrMesure = NbrMesure

END SUB

'==========================================================================
'
SUB AfficheOnOff

    ' Logique du ON/OFF (Activation de la barre d'espacement)
    Tic = Tic * -1
    IF Tic = 1 THEN
        COLOR MagentaPale: LOCATE 23, 11: PRINT "ON"
        COLOR VertPale: LOCATE 23, 16: PRINT "OFF"
    ELSE
        COLOR VertPale: LOCATE 23, 11: PRINT "ON"
        COLOR MagentaPale: LOCATE 23, 16: PRINT "OFF"
    END IF

END SUB

'==========================================================================
'
SUB AfficheTempo
   
    ' Affiche le Tempo
    COLOR Jaune: LOCATE 15, 4: PRINT USING "###"; Tempo
    
    SELECT CASE Tempo
        CASE IS < 61
            NouveauTempo = 1
        CASE IS < 82
            NouveauTempo = 2
        CASE IS < 103
            NouveauTempo = 3
        CASE IS < 124
            NouveauTempo = 4
        CASE IS < 145
            NouveauTempo = 5
        CASE IS < 166
            NouveauTempo = 6
        CASE IS < 187
            NouveauTempo = 7
        CASE ELSE
            NouveauTempo = 8
    END SELECT
   
    '(AFFICHE NOUVEAU TEMPO)
    COLOR RougePale: LOCATE 20 - NouveauTempo, 9: PRINT "Û": 'CHR$(219)
    COLOR CyanPale: LOCATE 20 - NouveauTempo, 11: PRINT Tempo$(NouveauTempo)
   
    IF NouveauTempo < AncienTempo THEN
        '(EFFACE L'ANCIEN TEMPO)
        COLOR Bleue: LOCATE 20 - AncienTempo, 9: PRINT "Û": 'CHR$(219)
    END IF

    IF NouveauTempo <> AncienTempo THEN
        COLOR Cyan: LOCATE 20 - AncienTempo, 11: PRINT Tempo$(AncienTempo)
        AncienTempo = NouveauTempo
    END IF

END SUB

'==========================================================================
'
SUB CalculeTempo

    ' LOGIQUE DU TEMPO (Le tempo est augment‚ ou diminu‚ de Delta)
    COLOR Jaune
             
    IF Touche = 77 THEN
        IF Tempo <> 208 THEN
            Tempo = Tempo + Delta
        END IF
    ELSE
        IF Tempo <> 40 THEN
            Tempo = Tempo - Delta
        END IF
    END IF
   
    Secondes = 60 / Tempo
    DureeSilence = Secondes * 18.2 - .7
    AfficheTempo

END SUB

'==========================================================================
'
SUB DessineEcran

    LOCATE 1, 1: PRINT CHR$(201)
    LOCATE 1, 2: FOR I = 2 TO 39: PRINT CHR$(205); : NEXT
    LOCATE 1, 40: PRINT CHR$(187)
    FOR I = 2 TO 24: LOCATE I, 40: PRINT CHR$(186); : NEXT
    LOCATE 25, 40: PRINT CHR$(188);
    FOR I = 39 TO 2 STEP -1: LOCATE 25, I: PRINT CHR$(205); : NEXT
    LOCATE 25, 1: PRINT CHR$(200);
    FOR I = 24 TO 2 STEP -1: LOCATE I, 1: PRINT CHR$(186); : NEXT
    FOR I = 2 TO 39: LOCATE 7, I: PRINT CHR$(205); : NEXT
    LOCATE 7, 1: PRINT CHR$(204): LOCATE 7, 40: PRINT CHR$(185);
    FOR I = 2 TO 39: LOCATE 21, I: PRINT CHR$(205); : NEXT
    LOCATE 21, 1: PRINT CHR$(204): LOCATE 21, 40: PRINT CHR$(185);
    FOR I = 8 TO 20: LOCATE I, 20: PRINT CHR$(186): NEXT
    LOCATE 7, 20: PRINT CHR$(203): LOCATE 21, 20: PRINT CHR$(202)
    FOR I = 22 TO 24: LOCATE I, 26: PRINT CHR$(186); : NEXT
    LOCATE 21, 26: PRINT CHR$(203): LOCATE 25, 26: PRINT CHR$(202);
    COLOR VertPale: LOCATE 3, 18: PRINT "TEMPO"
    LOCATE 5, 10: PRINT "M‚tronome Electronique"
    COLOR Jaune: LOCATE 9, 7: PRINT "TEMPO": COLOR VertPale
    LOCATE 13, 4: PRINT CHR$(27); " "; CHR$(26): COLOR Cyan
    FOR I = 1 TO 8: LOCATE 11 + I, 11: PRINT Tempo$(9 - I): NEXT
    COLOR Jaune: LOCATE 9, 27: PRINT "MESURE ": COLOR VertPale
    LOCATE 11, 28: PRINT CHR$(25): LOCATE 11, 31: PRINT CHR$(24)
    COLOR Cyan: FOR I = 1 TO 6: LOCATE 13 + I, 22: PRINT NoMesure$(7 - I)
    LOCATE 13 + I, 28: PRINT Mesure$(7 - I): NEXT
    COLOR VertPale: LOCATE 23, 9: PRINT "[ ON / OFF ]"
    COLOR VertPale: LOCATE 22, 6: PRINT "Barre d'espacement"
    COLOR Gris: LOCATE 23, 28: PRINT "ESC  sortir";

END SUB

'==========================================================================
'
SUB Initialisation
   
    CLS
    Mesure$(1) = "UN temps"
    Mesure$(2) = "DEUX temps"
    Mesure$(3) = "TROIS temps"
    Mesure$(4) = "QUATRE temps"
    Mesure$(5) = "CINQ temps"
    Mesure$(6) = "SIX temps"

    NoMesure$(6) = "6"
    NoMesure$(5) = "5"
    NoMesure$(4) = "4"
    NoMesure$(3) = "3"
    NoMesure$(2) = "2"
    NoMesure$(1) = "1"

    Tempo$(1) = "Largo"
    Tempo$(2) = "Lento"
    Tempo$(3) = "Adagio"
    Tempo$(4) = "Andante"
    Tempo$(5) = "Moderato"
    Tempo$(6) = "Allegro"
    Tempo$(7) = "Vivace"
    Tempo$(8) = "Presto"

    DessineEcran
    PresentationLogiciel

    NbrMesure = 4
    AncienNbrMesure = 5
    Tic = 1
    Tempo = 120
    AncienTempo = 4
    DureeSilence = 8.4
    Delta = 4: ' (Incr‚mentation du Tempo - entier plus grand que 0)

    COLOR RougePale
    FOR I = 19 TO 17 STEP -1
        LOCATE I, 9: PRINT "Û": 'CHR$(219)
    NEXT

    FOR I = 19 TO 17 STEP -1
        LOCATE I, 26: PRINT "Û": 'CHR$(219)
    NEXT
   
    AfficheTempo
    AfficheMesure
    AfficheOnOff

END SUB

'==========================================================================
'
SUB PresentationLogiciel
   
    COLOR Blanc
    LOCATE 8, 56: PRINT "T E M P O"
    LOCATE 10, 49: PRINT "M‚tronome ‚lectronique"
    LOCATE 12, 56: PRINT "fait par"
    LOCATE 14, 55: PRINT "REAL DOLBEC"
    LOCATE 16, 50: PRINT "le 30 septembre 1989"
    LOCATE 18, 55: PRINT "Version 1.0"
                
END SUB

'==========================================================================
'
SUB VerifieMesure

    ' LOGIQUE DE LA MESURE

    IF Touche = 72 THEN
        IF NbrMesure <> 6 THEN
            NbrMesure = NbrMesure + 1
            AfficheMesure
        END IF
    ELSE
        IF NbrMesure <> 1 THEN
            NbrMesure = NbrMesure - 1
            AfficheMesure
        END IF
    END IF
    
END SUB

