Non ci sono prodotti a carrello.
Per quanto riguarda Mozzi il programma è basato su di un esempio contenuto nella libreria da me opportunamente modificato ed ampliato per poter ricevere gli input sotto forma di comando + parametro non da potenziometri o ldr come era inizialmente ma dalla seriale via usb direttamente dal programma scritto in visual basic 2010 .net. Il sorgente è ben commentato per quanto riguarda Mozzi. Ci soffermiamo quindi sulle aggiunte ed in particolare sul gestore dei comandi pervenuti dal vb.net. Vediamo perciò come vengono gestiti e/o interpretati i comandi ricevuti via seriale da vb.net.
Il comando che arriva è cosi composto:
<LDR1:200>
In pratica lo stesso è composto da uno start cmd ‘<’ dal comando vero e proprio, da un ‘:’ che identifica l’inizio del valore del parametro riferito al comando in oggetto ed infine da uno end cmd ‘>’. Per come è strutturato lo stesso il numero di caratteri tra < e : è dinamico per cui può essere di 2,3,4,5 … caratteri. Lo stesso vale per i parametri in cui anche x essi la lunghezza è dinamica. La funzione recvWithStartEndMarkers()si occupa di estrarre tutto ciò che è contenuto tra < e > . In essa viene scartato qualsiasi comando privo di uno o di entrambi ‘<’ e ‘>’ .
Mentre la funzione di split tra comando e parametro è ad esempio:
int Test4 = receivedCharsS.indexOf("LDR1"); if (Test4 >= 0) { Serial.print("CMD 1 "+receivedCharsS+"\n"); int TestV = receivedCharsS.indexOf(":"); if (TestV >= 0) { Serial.print("CMD 2 "+receivedCharsS+"\n"); String Valore = receivedCharsS.substring(TestV + 1, receivedCharsS.length()); int Val = Valore.toInt(); LDR1_value = Val; Serial.print("CMD 3 "+receivedCharsS+"\n"); } } int LDR1_calibrated = kMapIntensity(LDR1_value); // calculate the fm_intensity fm_intensity = ((long)LDR1_calibrated * knob2Val * (kIntensityMod.next() + 128)) >> 8; //lo shift >> 8 equivale ad una moltiplicazione a 8 bit
in essa prima si estrae il comando testando se si tratta di un comando valido e se è ok, si estrae la parte del parametro che poi viene caricata nell’apposita variabile che in precedenza, prima della mia modifica serviva a contenere il valore letto da una delle porte analogiche a cui era collegato un potenziometro od una ldr. La scansione dei comandi avviene dentro alla funzione updateControl() di Mozzi . Vediamo ora invece la parte in vb.net che invia i comandi.
All’avvio viene visualizzata la videata riportata qui sotto:
In essa si possono notare i 5 slider dei controlli del Synth e sotto i tasti per inviare i valori riportati sullo slider sotto forma di comando. In questa prima versione vengono inviati i valori uno alla volta bloccando nel frattempo i rimanenti presenti a video e questo per circa 5 secondi per ovviare alla tipica lentezza della linea seriale. Ho voluto stare parecchio largo nelle tempistiche ma ovviamente ho già in programma la gestione diretta degli slider in una prossima versione che ho in preparazione. Ho anche in preparazione la gestione di fishino synth via WIFI. Questo per sfruttare le notevoli possibilità offerte da Fishino. Ho anche in preparazione sempre in vb.net la gestione di un sequencer ad 8 note che salverà i dati della sequenza programmata direttamente nella microsd presente a bordo scheda fishino.
Ma vediamo alcune parti del sorgente in vb.net 2010…
Imports System.IO Imports System.IO.Ports Imports System.Threading Definizione di classe del form. Public Class frmFishinoSynth Public GTrackBar22W As Integer Queste sono le variabili dove vengono memorizzati i valori impostati sugli slider a video '--------------------------------------------- ' variabili deposito frequenze oscillatori '-------------------------------------------- Public FrqOSC1BARV As Integer Public FrqOSC2BARV As Integer Public FrqOSC3BARV As Integer Public FrqOSC4BARV As Integer Public FrqOSC5BARV As Integer '------------------------------ Public StatoPorta As Boolean '----------------------------- Shared _continue As Boolean Funzione di caricamento della videata all’avvio delprogramma Private Sub frmFishinoSynth_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load Vengono impostati i parametri di gestione della porta seriale per il colloquio con fishino SerialPort1.Close() SerialPort1.PortName = "com8" 'cambiare con la vostra porta di arduino SerialPort1.BaudRate = 115200 SerialPort1.DataBits = 8 SerialPort1.Parity = Parity.None SerialPort1.StopBits = StopBits.One SerialPort1.Handshake = Handshake.None SerialPort1.Encoding = System.Text.Encoding.Default 'very important! ' SerialPort1.Open() End Sub Funzione che gestisce l’eventi di click sul tasto che invia il comando a fishino Private Sub ONOSC1_Click(sender As System.Object, e As System.EventArgs) Handles ONOSC1.Click If StatoPorta = True Then Dim Comando As String = "<KNOB:" & FrqOSC1BARV.ToString & ">" SerialPort1.Write(Comando) Call BloccaInvio() End If End Sub Private Sub Spegni_Click(sender As System.Object, e As System.EventArgs) Handles Spegni.Click SerialPort1.Close() End End Sub Private Sub Accendi_Click(sender As System.Object, e As System.EventArgs) Handles Accendi.Click SerialPort1.Open() StatoPorta = True Accendi.Visible = False Spegni.Visible = True End Sub Funzione che gestisce l’evento di change dello slider e ne intercetta i valori Private Sub FrqOSC1BAR_ValueChanged(sender As System.Object, e As System.EventArgs) Handles FrqOSC1BAR.ValueChanged FrqOSC1BARV = FrqOSC1BAR.Value FrqOSC1.Text = FrqOSC1BARV.ToString & " " End Sub Funzione che gestisce l’evento di change dello slider e ne intercetta i valori Private Sub FrqOSC2BAR_ValueChanged(sender As System.Object, e As System.EventArgs) Handles FrqOSC2BAR.ValueChanged FrqOSC2BARV = FrqOSC2BAR.Value FrqOSC2.Text = FrqOSC2BARV.ToString & " " End Sub Funzione che gestisce l’evento di change dello slider e ne intercetta i valori Private Sub FrqOSC3BAR_ValueChanged(sender As System.Object, e As System.EventArgs) Handles FrqOSC3BAR.ValueChanged FrqOSC3BARV = FrqOSC3BAR.Value FrqOSC3.Text = FrqOSC3BARV.ToString & " " End Sub Funzione che gestisce l’evento di change dello slider e ne intercetta i valori Private Sub FrqOSC4BAR_ValueChanged(sender As System.Object, e As System.EventArgs) Handles FrqOSC3BAR.ValueChanged FrqOSC4BARV = FrqOSC4BAR.Value FrqOSC4.Text = FrqOSC4BARV.ToString & " " End Sub Funzione che gestisce l’evento di change dello slider e ne intercetta i valori Private Sub FrqOSC5BAR_ValueChanged(sender As System.Object, e As System.EventArgs) Handles FrqOSC3BAR.ValueChanged FrqOSC5BARV = FrqOSC5BAR.Value FrqOSC5.Text = FrqOSC5BARV.ToString & " " End Sub Funzione che gestisce l’evento di click sul tasto che invia il comando a fishino Private Sub ONOSC2_Click(sender As System.Object, e As System.EventArgs) Handles ONOSC2.Click If StatoPorta = True Then Dim Comando As String = "<LDR1:" & FrqOSC2BARV.ToString & ">" SerialPort1.Write(Comando) Call BloccaInvio() End If End Sub Funzione che gestisce l’evento di click sul tasto che invia il comando a fishino Private Sub ONOSC3_Click(sender As System.Object, e As System.EventArgs) Handles ONOSC3.Click If StatoPorta = True Then Dim Comando As String = "<LDR2:" & FrqOSC3BARV.ToString & ">" SerialPort1.Write(Comando) Call BloccaInvio() End If End Sub Funzione che gestisce l’evento di click sul tasto che invia il comando a fishino Private Sub ONOSC4_Click(sender As System.Object, e As System.EventArgs) Handles ONOSC4.Click If StatoPorta = True Then Dim Comando As String = "<LDR3:" & FrqOSC4BARV.ToString & ">" SerialPort1.Write(Comando) Call BloccaInvio() End If End Sub Funzione che gestisce l’evento di click sul tasto che invia il comando a fishino Private Sub ONOSC5_Click(sender As System.Object, e As System.EventArgs) Handles ONOSC5.Click If StatoPorta = True Then Dim Comando As String = "<LDR4:" & FrqOSC5BARV.ToString & ">" SerialPort1.Write(Comando) Call BloccaInvio() End If End Sub Funzione che gestisce il blocco dei tasti di invio dei comandi durante l’invio di un singolo comando. Private Sub BloccaInvio() ONOSC1.Enabled = False ONOSC2.Enabled = False ONOSC3.Enabled = False ONOSC4.Enabled = False ONOSC5.Enabled = False txtATTESA.Visible = True txtATTESA.Refresh() System.Threading.Thread.Sleep(5000) ONOSC1.Enabled = True ONOSC2.Enabled = True ONOSC3.Enabled = True ONOSC4.Enabled = True ONOSC5.Enabled = True txtATTESA.Visible = False txtATTESA.Refresh() End Sub End Class
Per questa introduzione all’uso di Mozzi su Fishino ci fermiamo qui … nel frattempo preparerò altre funzionalità per portare ad essere sempre più evoluto il nostro synth virtuale. E inizieremo anche a parlare di come è normalmente composto un reale sintetizzatore che sia di tipo analogico che digitale. Per cui parleremo nuovamente di oscillatori nelle classiche forme d’onda che generano cioè: sinusoidale, triangolare, quadra, a dente di sega, poi anche di : generatori di inviluppo o adsr, lfo, vcf, vca, modulatori ad anello. Parleremo anche di generatori di suono per Fishino esterni allo stesso ma pilotati da esso con tensioni a 5V. Parleremo perciò della serie CEM e SSM. E anche degli splendidi chip monosynth quali ad esempio il dsp-g1 pilotabile da fishino via una uscita midi realizzata appunto con fishino.
Detto questo al grido di pane ed infortronica per tutti vi saluto e… a presto.
3 Commenti