Convertire i dati grezzi delle note del messaggio Midi "NoteOn" nei corrispondenti simboli del protocollo ABC di notazione musicale
Da Gambas-it.org - Wikipedia.
Versione del 4 lug 2023 alle 21:04 di Vuott (Discussione | contributi)
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 tmp As Date 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] ' Apre il file-device in "Lettura" e lo pone in "Osservazione: fl = Open disp For Read Watch End Public Sub File_Read() Dim b As Byte Read #fl, b If b > 249 Then Return nt.Push(CStr(b)) ' Al primo dato midi utile, viene preso l'orario corrente: If nt.Count = 1 Then tmp = Time ' Dopo i tre Messaggi Midi "Note-On" di accensione della nota e dopo gli altri tre Messaggi Midi di spegnimento della nota, viene preso nuovamente l'orario corrente: If nt.Count = 6 Then If (Val(nt[0]) > 143) Or (Val(nt[0]) < 160) Then ElaboraNota(nt[1], ElaboraTempo(Time)) 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(TempoDopo As Date) As Short Return CShort(DateDiff(tmp, TempoDopo, gb.Millisecond)) 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