Convertire i dati grezzi delle note del messaggio Midi "NoteOn" nei corrispondenti simboli del protocollo ABC di notazione musicale: differenze tra le versioni
Vai alla navigazione
Vai alla ricerca
Nessun oggetto della modifica |
Nessun oggetto della modifica |
||
| Riga 1: | Riga 1: | ||
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. | 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 | Public Struct Dati_Nota | ||
codex As String | codex As String | ||
tempus As Short | tempus As Short | ||
End | End | ||
| Riga 64: | Riga 64: | ||
Private Procedure MostraRisultato(nota As String, msDurata As Short) | Private Procedure MostraRisultato(nota As String, msDurata As Short) | ||
<FONT Color=gray>' ''Mostra in console il codice ABC relativo alla nota premuta sulla tastiera:''</font> | |||
Print Converte(nota) | Print Converte(nota) | ||
<FONT Color=gray>' ''Mostra in console la durata della nota in millesimi di secondo:''</font> | |||
Print msDurata | Print msDurata | ||
Versione delle 21:14, 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
tempus As Short
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 MostraRisultato(nota As String, msDurata As Short)
' Mostra in console il codice ABC relativo alla nota premuta sulla tastiera:
Print Converte(nota)
' Mostra in console la durata della nota in millesimi di secondo:
Print msDurata
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