Convertire i dati grezzi delle note del messaggio Midi "NoteOn" nei corrispondenti simboli del protocollo ABC di notazione musicale
Vai alla navigazione
Vai alla ricerca
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 Struct
Private FileDevice_Midi As String ' Contiene il percorso del file-device del dispositivo Midi esterno aperto da ALSA
Private fl As File
Private nt As String[]
Private f As Float
Public Sub Main()
Dim disp As String = "/dev/snd"
nt = New String[]
If Dir(disp, "midi*", gb.Device).Count == 0 Then Return
disp &/= Dir(disp, "midi*", gb.Device)[0]
FileDevice_Midi = disp
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.Add(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, risTempo)
.tempus = risTempo
End With
With notaStr
Print .codex,
Print .tempus
End With
End
' Se si tiene premuto un tasto nero della tastiera Midi per una durata inferiore a ms 1000, allora sarà inviato il simbolo della nota unitamente al simbolo ABC del 'diesis': ^ ; altrimenti sarà inviato il simbolo ABC del 'bemolle': _
Private Function Converte(nota As Byte, t As Short) As String
Dim alt As String
If t < 999 Then
alt = "^"
Else
alt = "_"
Endif
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