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 3: | Riga 3: | ||
codex As String <FONT Color=gray>' ''Il codice ABC relativo alla nota premuta sulla tastiera''</font> | codex As String <FONT Color=gray>' ''Il codice ABC relativo alla nota premuta sulla tastiera''</font> | ||
tempus As Short <FONT Color=gray>' ''La durata della nota in millesimi di secondo''</font> | tempus As Short <FONT Color=gray>' ''La durata della nota in millesimi di secondo''</font> | ||
End | End | ||
Private | Private Const DIESIS As String = "^" | ||
Private Const BEMOLLE As String = "_" | |||
Private fl As File | Private fl As File | ||
Private nt As String[] | Private nt As String[] | ||
| Riga 11: | Riga 12: | ||
Public Sub Main() | |||
Dim disp As String = "/dev/snd" | Dim disp As String = "/dev/snd" | ||
nt = New String[] | nt = New String[] | ||
If Dir(disp, "midi*", gb.Device).Count == 0 Then Return | If Dir(disp, "midi*", gb.Device).Count == 0 Then Return | ||
<FONT Color=gray>' ''Contiene il percorso del file-device del dispositivo Midi esterno aperto da ALSA:''</font> | |||
disp &/= Dir(disp, "midi*", gb.Device)[0] | 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 b As Byte | ||
| Riga 35: | Riga 37: | ||
If b > 249 Then Return | If b > 249 Then Return | ||
nt. | nt.Push(CStr(b)) | ||
If nt.Count = 1 Then f = CFloat(Now) | If nt.Count = 1 Then f = CFloat(Now) | ||
If nt.Count = 6 Then | If nt.Count = 6 Then | ||
| Riga 45: | Riga 47: | ||
Endif | Endif | ||
End | |||
Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera, si chiude il programma''</font> | |||
Quit | Quit | ||
End | |||
Private Function ElaboraTempo(TempoPrima As Float, TempoDopo As Float) As Short | |||
Return CShort((CSingle(Frac(TempoDopo)) * 100000000) - (CSingle(Frac(TempoPrima)) * 100000000)) | 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 | Dim notaStr As New Dati_Nota | ||
With notaStr | With notaStr | ||
.codex = Converte(nota | .codex = Converte(nota) | ||
.tempus = risTempo | .tempus = risTempo | ||
End With | End With | ||
| Riga 73: | Riga 78: | ||
End With | End With | ||
End | |||
Private Function Converte(nota As Byte) As String | |||
<FONT Color=gray>' ''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': '''_''' ''</font> | |||
Dim alt As String = DIESIS <FONT Color=gray>' ''oppure: '''BEMOLLE'''''</font> | |||
Select Case nota | Select Case nota | ||
| Riga 307: | Riga 307: | ||
End Select | End Select | ||
End | |||
Versione delle 20:35, 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 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
' 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:
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