+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Macro Metronomo Musicale

  1. #1
    Eusty non è in linea Scolaretto
    Post
    64

    Macro Metronomo Musicale

    Buongiorno,
    Sto creando una macro che mi serve in campo musicale...per visualizzare in 2 celle il numero della battuta che sto suonando e nella cella adiacente mi conta le pulsazioni.
    Per esempio Battute da 4/4 (spero di non essere troppo tecnico musicalmente) vorrei che nella prima cella comparisse 1 e nella seconda 1/4, poi 2/4, poi 3/4, poi 4/4 a questo punto nella prima cella scrive 2 e nella seconda ricomincia con 1/4...
    Tutto questo ovviamente a tempo, ovvero gli imposto una velocità (x esempio 120 bpm = deve aumentare di 1/4 ogni 0.5 secondi…)
    Io ho impostato il foglio in questo modo:
    Colonna A: N° Battuta (A1=1, A2=2, A3=3,....)
    Colonna B e C: N°Pulsazioni della Battuta (B1=4 e C1=4 --> devo arrivare a 4/4 prima di cambiare battuta….B2=3 e C2=4 --> devo arrivare a 3/4 prima di cambiare battuta….)
    Colonna D: Velocità (D1=120 --> 120 bpm, D2=60 --> 60 bpm…)
    Nel foglio ho inserito anche 2 CommandButton, Uno per avviare il metronomo e uno per fermarlo.

    Poi ho scritto questo codice:
    codice:
    Dim bln As Boolean
    Dim b As Double, t As Double, bpm As Long, beats As Long, beat As Long
    Dim col2do As Long, row2do As Long, count As Long, CountMax As Long
    
    Public Sub Metro()
    CountMax = Range("A" & Rows.count).End(xlUp).Row
       count = 1
       beat = 1
    
        t = 0
        DoEvents
        If bln = True Then
            Exit Sub
        End If
        Do
            If t < Timer Then
                bpm = Sheets("Foglio1").Cells(count, 4)
                b = 1 / bpm * 60
                t = Timer + b
                beats = Sheets("Foglio1").Cells(count, 2)
                Beep
                Sheets("Foglio1").Cells(1, 10) = count
                Sheets("Foglio1").Cells(1, 11) = beat & "/" & Sheets("Foglio1").Cells(count, 3)
                
                t = t + b
                If beat = beats Then
                    count = count + 1
                    beat = 1
                Else
                    beat = beat + 1
                End If
            End If
        Loop
    End Sub
    
    
    Private Sub CommandStart_Click()
        bln = False
        Call Metro
    End Sub
    
    Private Sub CommandStop_Click()
        bln = True
    End Sub
    Il codice più o meno funziona…ho questi 2 problemi:
    1) Va alla metà del tempo (invece che a 120 va a 60...)
    2) Non funziona il pulsante stop, durante l'esecuzione del codice non riesco a fare nulla finchè non arriva in fondo

    Avete dei consigli??
    Grazie in anticipo

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,772
    Blogs
    5
    1) Perché hai scritto t = Timer + b e anche t = t + b ?

    2) Queste

    codice:
        DoEvents
        If bln = True Then
            Exit Sub
        End If
    vanno all'interno del ciclo
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    Eusty non è in linea Scolaretto
    Post
    64
    1) Perché hai scritto t = Timer + b e anche t = t +
    Errore di copia e incolla….t=t+b non centra.

    2) Queste

    codice:
    DoEvents
    If bln = True Then
    Exit Sub
    End If
    vanno all'interno del ciclo
    Perfetto ora funziona..grazie mille!!!

  4. #4
    Eusty non è in linea Scolaretto
    Post
    64
    Ora complico un attimo le cose...purtroppo non sempre il tempo nella musica è lineare...accelera, rallenta e a volte si ferma.
    Per accelerare e rallentare sono riuscito a scrivere il codice rallentando (o accelerando) costantemente ogni 1/4.
    Il problema è fermarsi...non riesco a trovare l'input per provare a scrivere.
    In pratica può succedere che arrivo in una battuta e mi fermo sul 1/4 per, per esempio, 5 secondi e poi ripartire direttamente dal 4/4 della stessa battuta (Nel codice la battuta è la variabile count)

  5. #5
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    388
    Quote Originariamente inviato da Eusty Visualizza il messaggio
    In pratica può succedere che arrivo in una battuta e mi fermo sul 1/4 per, per esempio, 5 secondi e poi ripartire direttamente dal 4/4 della stessa battuta (Nel codice la battuta è la variabile count)
    Intendi inserire una pausa minima puntata? Perché a livello di ritmo non puoi fermarti un tempo arbitrario in secondi... Sul primo quarto inserisci una pausa con valore di minima puntata e quindi la nota successiva risulterà sull'ultimo quarto.

  6. #6
    Dev-01 non è in linea Scribacchino
    Post
    530
    @Sgrubak
    Secondo me intende che il foglio di calcolo non si aggiorna e all'improvviso si ritrova su una battuta successiva (non lineare) come se nulla fosse accaduto.

    @Eusty
    Hai provato a vedere cosa accade quando sposti il mouse?

    La cadenza del loop è legata alle operazioni che deve eseguire al suo interno e dai carichi hardware del momento (sopratutto la CPU).

    Anche se probabilmente il foglio di calcolo rimane la finestra attiva, non è detto che abbia priorità assoluta su tutto: dipende anche dalla presenza di servizi in background sia di Windows che non.

  7. #7
    Eusty non è in linea Scolaretto
    Post
    64
    @Eusty
    Hai provato a vedere cosa accade quando sposti il mouse?

    La cadenza del loop è legata alle operazioni che deve eseguire al suo interno e dai carichi hardware del momento (sopratutto la CPU).

    Anche se probabilmente il foglio di calcolo rimane la finestra attiva, non è detto che abbia priorità assoluta su tutto: dipende anche dalla presenza di servizi in background sia di Windows che non.
    Sul mio PC ho fatto partire il programma e un metronomo classico e avanzano con lo stesso ritmo.
    Ho fatto la stessa cosa su un altro PC ed effettivamente, anche se di poco, dopo un po' perde i colpi
    Esiste qualche procedura per ovviare a questo problema??

  8. #8
    Dev-01 non è in linea Scribacchino
    Post
    530
    In tutta onestà credo che Excel non sia adatto per questo genere di cose.

    Fin quando hai intenzione di realizzare un qualche tipo di esercizio (che a livello pratico, nel caso specifico) lascia un po' il tempo che trova, può anche andar bene... ma se vuoi realizzare una cosa più affidabile dovresti rivolerti verso un linguaggio diverso.

    Secondo me partendo dal VBA e con pochissimo sforzo potresti apprendere in qualche ora le nozioni che ti consentono di realizzare il tutto in VB.net.

    Però io le tue reali esigenze non le conosco e non so se per te sia fattibile.

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi