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"
 
  nt = New String[]
 
 
   
 
   
 
   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


Riferimenti