Arduino MIDI Out: composizione Algoritmica con Arduino

Reading Time: 3 minutes


Questa guida presenta il codice per Arduino che consente di generare una sequenza casuale di note MIDI da inviare al MIDI IN di un qualsiasi strumento musicale.

Il codice

Il codice presentato in questa guida genera una sequenze di note MIDI che possono essere inviate attraverso la connessione seriale di Arduino a un qualsiasi strumento musicale dotato di ingresso MIDI (MIDI IN).

Attraverso le due variabili maxRegister e minRegister si può modificare l’intervallo di altezze in cui è definita la sequenza di note casuali generate dal programma. Inoltre, le note sono caratterizzate da una successione ricorrente (pattern) di valori di durate e d’intensità definita all’interno di una misura di 4/4. Modificando i valori inseriti nei vettori Duration[ ] e Velocity[ ] si possono definire le due sequenze di valori di durata e d’intensità da utilizzare.

La struttura della funzione loop()

Nella funzione loop() si genera periodicamente un nuovo valore di altezza con la funzione di Arduino random(). Il valore di altezza si salva nella variabile pitch, in seguito si invia una nuova nota MIDI con la funzione MIDI.sendNoteOn(), con il comando delay(NoteDuration), si pone il microcontrollore in attesa per un tempo pari alla durata della nota e, infine, si invia il messaggio MIDI NoteOff (MIDI.sendNoteOff()) per interrompere la riproduzione del suono.

Abbiamo sviluppato questo codice per il nostro prototipo CapBoard. Come già illustrato in questa guida, L’uso della funzione delay() di Arduino purtroppo non consente di ottenere dei risultati soddisfacenti per creare una successione temporale periodica di eventi. Presto pubblicheremo una nuova versione del codice che risolve questo inconveniente.

/*
  MIDI Out Test for CapBoard
  Sends out MIDI notes with a random pitch defined in the interval from minRegister to maxRegister

  To use this sketch you need to install the MIDI library. 
  Follow this link to download the library
  http://playground.arduino.cc/Main/MIDILibrary

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  
  See the GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.

  Copyright © 2016 Costantino Rizzuti
  Artis Lab - 2016
  www.artislab.it
  info@artislab.it
 */

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();

int BPM=180;
float subdivision=1;
// 2  ->half note
// 1  ->quarter note
// 0.5->eight note
int maxRegister=60;
int minRegister=24;
int interval;
int pitch=60;
float Duration[] = {1,0.5,0.5,1,1};//Note duration pattern
// 2  ->half note
// 1  ->quarter note
// 0.5->eight note
//int Velocity[]={127, 90, 80,118,105};
int Velocity[]={127, 127, 80,127,127};//Velocity pattern
int DurCount=0;

void setup()
{
    MIDI.begin(4);// Launch MIDI and listen to channel 4
    interval=subdivision*60000/BPM; 
    //calculate the period in millisecond according with BPM and Subdivision
}

void loop()
{
    pitch=random(minRegister,maxRegister);
    MIDI.sendNoteOn(pitch, Velocity[DurCount], 1);    
    // Send a Note (pitch, velocity, on channel 1)
    int NoteDuration=interval*Duration[DurCount];
    delay(NoteDuration);// Wait for NoteDuration milliseconds
    MIDI.sendNoteOff(pitch, 0, 1);// Stop the note
    DurCount++;
    if(DurCount>5){
        DurCount=0;
    }
}

Arduino MIDI Out: Applicazioni

Con questo codice abbiamo realizzato il brano MIDI Out test (omaggio a Conlon Nancarrow) inserito nella raccolta Made with CapBoard. Per la realizzazione di questo lavoro i messaggi MIDI, prodotti con Arduino, controllavano un pianoforte digitale. Quindi, il brano è stato composto sovrapponendo quattro diverse tracce registrate modificando la disposizione di registro attraverso i valori delle variabili maxRegister e minRegister e la pulsazione di riferimento per il calcolo delle durate. Per fare ciò, si è lasciato inalterato il tempo espresso in BPM, mentre si è modificato il valore della variabile suddivision.

Ascolta ora la traccia!

oppure tutto l’album:

Perché non dai anche uno sguardo ai nostri prodotti su Tindie.com?

I sell on Tindie

Se ti piace questo progetto e vuoi provare a realizzarlo per problemi, curiosità oppure suggerimenti scrivici qui di seguito:

Codice di sicurezza:
security code
Inserire un codice di sicurezza.:

Invia

 

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *