Sintetizzatore virtuale MOZZI/Fishino by Gianroberto Negri

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:

figura2

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.

Scarica il progetto completo

3 Commenti

  1. interessante applicazione tra visualstudio 2010 e fishino. interessante la spiegazione della libreria mozzi resa semplice per tutti.
  2. splendido progetto, proverò a repricarlo. Se uso un fishino Mega invece di un fishino uno devo modificare qualcosa o prendere degli accorgimenti? Grazie

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Main Menu