Differenze tra le versioni di "Convertire i dati grezzi delle note del messaggio Midi "NoteOn" nei corrispondenti simboli del protocollo ABC di notazione musicale"
Da Gambas-it.org - Wikipedia.
Riga 8: | Riga 8: | ||
Private Const BEMOLLE As String = "_" | Private Const BEMOLLE As String = "_" | ||
Private fl As File | Private fl As File | ||
− | Private nt As String[] | + | Private nt As New String[] |
Private f As Float | Private f As Float | ||
Riga 15: | Riga 15: | ||
Dim disp As String = "/dev/snd" | Dim disp As String = "/dev/snd" | ||
− | |||
− | |||
If Dir(disp, "midi*", gb.Device).Count == 0 Then Return | If Dir(disp, "midi*", gb.Device).Count == 0 Then Return |
Versione delle 20:36, 4 lug 2023
Per trasformare i dati grezzi, relativi alla nota, del Messaggio Midi "NoteOn", provenienti da un dispositivo Midi esterno (ad esempio una tastiera Midi esterna), nel corrispondente simbolo notazionale previsto dal protocollo ABC, è possibile adottare il seguente codice.
Public Struct Dati_Nota codex As String ' Il codice ABC relativo alla nota premuta sulla tastiera tempus As Short ' La durata della nota in millesimi di secondo End Private Const DIESIS As String = "^" Private Const BEMOLLE As String = "_" Private fl As File Private nt As New String[] Private f As Float Public Sub Main() Dim disp As String = "/dev/snd" If Dir(disp, "midi*", gb.Device).Count == 0 Then Return ' Contiene il percorso del file-device del dispositivo Midi esterno aperto da ALSA: disp &/= Dir(disp, "midi*", gb.Device)[0] FONT Color=gray>' Apre il file-device in "Lettura" e lo pone in "Osservazione:</font> fl = Open disp For Read Watch End Public Sub File_Read() Dim b As Byte Dim durata As Short Read #fl, b If b > 249 Then Return nt.Push(CStr(b)) If nt.Count = 1 Then f = CFloat(Now) If nt.Count = 6 Then If (Val(nt[0]) > 143) Or (Val(nt[0]) < 160) Then durata = ElaboraTempo(f, CFloat(Now)) ElaboraNota(nt[1], durata) nt = New String[] Endif Endif End Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera, si chiude il programma Quit End Private Function ElaboraTempo(TempoPrima As Float, TempoDopo As Float) As Short Return CShort((CSingle(Frac(TempoDopo)) * 100000000) - (CSingle(Frac(TempoPrima)) * 100000000)) End Private Procedure ElaboraNota(nota As String, risTempo As Short) Dim notaStr As New Dati_Nota With notaStr .codex = Converte(nota) .tempus = risTempo End With With notaStr Print .codex, Print .tempus End With End Private Function Converte(nota As Byte) As String ' Si deve scegliere se, premendo un tasto nero della tastiera musicale, si deve inviare unitamente al simbolo della nota anche il simbolo ABC del 'diesis': ^, oppure se si deve inviare anche il simbolo ABC del 'bemolle': _ Dim alt As String = DIESIS ' oppure: BEMOLLE Select Case nota Case 12 Return "C,,,," Case 13 Return alt & "C,,,," Case 14 Return "D,,,," Case 15 Return alt & "E,,,," Case 16 Return "E,,,," Case 17 Return "F,,,," Case 18 Return alt & "F,,,," Case 19 Return "G,,,," Case 20 Return alt & "G,,,," Case 21 Return "A,,,," Case 22 Return alt & "B,,,," Case 23 Return "B,,,," Case 24 Return "C,,," Case 25 Return alt & "C,,," Case 26 Return "D,,," Case 27 Return alt & "E,,," Case 28 Return "E,,," Case 29 Return "F,,," Case 30 Return alt & "F,,," Case 31 Return "G,,," Case 32 Return alt & "G,,," Case 33 Return "A,,," Case 34 Return alt & "B,,," Case 35 Return "B,,," Case 36 Return "C,," Case 37 Return alt & "C,," Case 38 Return "D,," Case 39 Return alt & "E,," Case 40 Return "E,," Case 41 Return "F,," Case 42 Return alt & "F,," Case 43 Return "G,," Case 44 Return alt & "G,," Case 45 Return "A,," Case 46 Return alt & "B,," Case 47 Return "B,," Case 48 Return "C," Case 49 Return alt & "C," Case 50 Return "D," Case 51 Return alt & "E," Case 52 Return "E," Case 53 Return "F," Case 54 Return alt & "F," Case 55 Return "G," Case 56 Return alt & "G," Case 57 Return "A," Case 58 Return alt & "B," Case 59 Return "B," Case 60 Return "C" ' Do centrale Case 61 Return alt & "C" Case 62 Return "D" Case 63 Return alt & "E" Case 64 Return "E" Case 65 Return "F" Case 66 Return alt & "F" Case 67 Return "G" Case 68 Return alt & "G" Case 69 Return "A" Case 70 Return alt & "B" Case 71 Return "B" Case 72 Return "c" Case 73 Return alt & "c" Case 74 Return "d" Case 75 Return alt & "e" Case 76 Return "e" Case 77 Return "f" Case 78 Return alt & "f" Case 79 Return "g" Case 80 Return alt & "g" Case 81 Return "a" Case 82 Return alt & "b" Case 83 Return "b" Case 84 Return "c'" Case 85 Return alt & "c'" Case 86 Return "d'" Case 87 Return alt & "e'" Case 88 Return "e'" Case 89 Return "f'" Case 90 Return alt & "f'" Case 91 Return "g'" Case 92 Return alt & "g'" Case 93 Return "a'" Case 94 Return alt & "b'" Case 95 Return "b'" Case 96 Return "c" Case 97 Return alt & "c" Case 98 Return "d" Case 99 Return alt & "e" Case 100 Return "e" Case 101 Return "f" Case 102 Return alt & "f" Case 103 Return "g" Case 104 Return alt & "g" Case 105 Return "a" Case 106 Return alt & "b" Case 107 Return "b" Case 108 Return "c" Case 109 Return alt & "c" Case 110 Return "d" Case 111 Return alt & "e" Case 112 Return "e" Case 113 Return "f" Case 114 Return alt & "f" Case 115 Return "g" Case 116 Return alt & "g" Case 117 Return "a" Case 118 Return alt & "b" Case 119 Return "b" Case 120 Return "c'" End Select End