Dispositivi MIDI in Java

Slides:



Advertisements
Presentazioni simili
Conservatorio “D. Cimarosa” di Avellino INFORMATICA MUSICALE
Advertisements

Java base V: La gestione delle Eccezioni
Java Stream e File. La classe File Per operare con lintero file java mette a disposizione la classe File Per utilizzare la classe File è necessario importare.
Lezione 18 MIDI e XML Programmazione MIDI (Prof. Luca A. Ludovico)
L’oscillatore digitale
MIDI e computer Lezione 17
Concetti fondamentali
Programmazione MIDI Presentazione del corso
PHP.
Informatica 2 Lezione 4 Corso di laurea in matematica Informatica 2 Dott. Ing. Leonardo Vito Corso di laurea matematica indirizzo matematica per le applicazioni.
Ogni PC, per iniziare a lavorare, ha bisogno di un sistema operativo. Infatti questo è il primo programma che viene eseguito e che permette all'utente.
Java: programmazione concorrente con condivisione di memoria
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
LIP: 4 Aprile 2008 ECCEZIONI. Eccezioni Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Java2 Esercitazioni del corso di Sistemi Informativi Marina Mongiello
Fondamenti di Informatica
1 System Call per Comunicazione tra Processi Pipe.
Argomenti dalla linea dei comandi Gli argomenti possono essere passati a qualsiasi funzione di un programma, compresa la main(), direttamente dalla linea.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
2) Sistemi operativi Lab. Calc. AA2004/05 - cap.2.
Sistemi Operativi GESTIONE DEI PROCESSI.
Windows Sistema operativo con interfaccia grafica per PC IBM compatibili (varie versioni dal 95) La gestione dei file viene fatta secondo le modalità.
Elaborazione di Franco Grivet Chin
Java base IV: Java e la programmazione O.O.
IL CONCETTO DI PACKAGE Una applicazione è spesso composta di molte classi (eventualmente correlate) Un package è un gruppo di classi che costi- tuiscono.
GESTIONE DEGLI ERRORI Spesso vi sono istruzioni critiche, che in certi casi possono produrre errori. Lapproccio classico consiste nellinse- rire controlli.
Programmazione in Java (9) Mauro Lorenzutti. 30/09/2005Corso Java - Mauro Lorenzutti2 Scaletta I/O Evoluto Serializzazione Comunicazioni via socket JUnit.
Cosa è una applicazione distribuita?
1 Lucidi delle esercitazioni di Sistemi di Elaborazione in Rete Università degli Studi della Calabria Corso di Laurea in Ingegneria Gestionale A.A. 2003/2004.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA FINALE DEL 21 MAGGIO 2007 NOME: COGNOME: ________________________________________________________________________________.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Appunti di Java (J2SDK 1.4.2, JDK 1.6.0) prof. Antonella Schiavon settembre 2009.
POSTA ELETTRONICA La posta elettronica è un’innovazione utilissima offerta da Internet. E’ possibile infatti al costo di una telefonata urbana (cioè del.
Programmazione ad oggetti
Laboratorio di Servizi Web - servlet - Ardissono 1 Java Servlet API package javax.servlet: include classi e interfacce di gestione di servlet indipendenti.
Interfacce grafiche Capitolo 27 marzo 2004 Interfacce grafiche.
CENTRAL PROCESSOR UNIT (CPU) 1/2 E’ l’unità che regola e controlla tutti I processi nel microcontroller. E’ formata da diverse sottounità tra cui: Instruction.
Ereditarieta’. Contenuti Introduciamo un meccanismo fondamentale di Java: l’ereditarieta’ Permette di estendere classi gia’ definite (ovvero di definire.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Capitolo 6 Iterazione Lucidi relativi al volume: Java – Guida alla programmazione James Cohoon, Jack Davidson Copyright © The McGraw-Hill Companies.
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
TW Asp - Active Server Pages Nicola Gessa. TW Nicola Gessa Introduzione n Con l’acronimo ASP (Active Server Pages) si identifica NON un linguaggio di.
Progetto di Linguaggi e modelli computazionali M Prof. Enrico Denti Progetto di: Francesco Paci.
1 Input/Output. 2 Livelli del sottosistema di I/O Hardware Gestori delle interruzioni Driver dei dispositivi Software di sistema indipendente dal dispositivo.
Progettare una classe 21 Febbraio La classe BankAccount Vogliamo realizzare una classe i cui oggetti sono dei semplici conti bancari. * Identifichiamo.
Esercitazione sull’ ordinamento 20 maggio 2003
13/08/02Input 1 Interagire con il computer Da tastiera Da riga di comando Funzioni di conversione.
28/12/2001package 1 Package Pacchetti e interfacce.
1 Metodo I metodi sono uno strumento che i programmatori usano per strutturare i programmi, sia per renderli più facili da capire che per permettere il.
Programmazione orientata agli Oggetti Introduzione a Java.
Gestire i dati: download e salvataggio. L’importanza dei dati La quasi totalità delle applicazioni hala necessità di gestire varie funzionalità relative.
Introduzione alle Classi e agli Oggetti in Java 1.
Eccezioni in Java. Le eccezioni in Java Exception handling: insieme di costrutti e regole sintattiche e semantiche presenti nel linguaggio allo scopo.
Dispositivi MIDI in Java
Trasmettitori e ricevitori
Transcript della presentazione:

Dispositivi MIDI in Java Lezione 23 Dispositivi MIDI in Java Programmazione MIDI (Prof. Luca A. Ludovico)

Introduzione Nella lezione precedente è stata introdotta la logica di descrizione di dati MIDI da parte del package Tipicamente i dati vengono scambiati tra dispositivi Ad esempio, un programma può generare messaggi MIDI da zero, ma spesso invece questi vengono creati da un sequencer o ricevuti su una porta MIDI In Di solito poi i messaggi vengono inviati a un altro dispositivo, quale un sintetizzatore o una porta MIDI Out In Java si creano allo scopo oggetti software che implementano l’interfaccia MidiDevice Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Interfaccia MidiDevice Usata per definire oggetti software in grado di inviare o ricevere messaggi MIDI Può presentare un’implementazione software pura o fungere come interfaccia per le porte MIDI di una scheda audio (hardware) Cos’è un’interfaccia Java? Un’interfaccia (interface) ha una struttura simile a una classe, ma può contenere solo metodi d'istanza astratti e costanti (quindi non può contenere costruttori, variabili statiche, variabili di istanza e metodi statici). Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Interfaccia MidiDevice Di base l’interfaccia MidiDevice fornisce tutte le funzionalità genericamente richieste da dispositivi di sequencing, sintetizzatori, porte MIDI di ingresso e uscita Esistono delle sotto-interfacce più specifiche di MidiDevice: Synthesizer e Sequencer L’interfaccia MidiDevice include metodi per “aprire” e “chiudere” un dispositivo Include inoltre la classe interna MidiDevice.Info che fornisce descrizioni testuali del dispositivo, tra cui il nome del modello, il produttore e la versione Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Trasmettitori e ricevitori Un MidiDevice può essere un trasmettitore di eventi MIDI, un ricevitore o entrambe le cose. Dunque MidiDevice deve mettere a disposizione istanze delle interfacce Transmitter o Receiver o entrambe. Tipicamente: le porte MIDI IN presentano trasmettitori le porte MIDI OUT e i sintetizzatori presentano ricevitori i sequencer mettono a disposizione trasmettitori per il playback e ricevitori per le operazioni di registrazione DeviceInfo.java Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Paradigma di ricezione e trasmissione In che modo un dispositivo invia i dati MIDI? Tramite uno o più trasmettitori In che modo un dispositivo riceve i dati MIDI? Tramite uno o più ricevitori Ogni trasmettitore può essere connesso a un solo ricevitore alla volta, ma non viceversa Se un dispositivo deve inviare messaggi MIDI a più dispositivi contemporaneamente, deve avere più trasmettitori Se un dispositivo deve poter ricevere messaggi MIDI da più mittenti simultaneamente, può (non deve avere) più ricevitori Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Esempi Porta MIDI In Synth Sequencer Midi Out 1 Midi Out 2 Trasmettitore Messaggio MIDI Ricevitore Sequencer Midi Out 1 Midi Out 2 Trasmettitore 1 Messaggio MIDI Ricevitore Trasmettitore 2 Messaggio MIDI Ricevitore Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Esempio Sintetizzatore Sintetizzatore Ricevitore da mittente 3 Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Sequencer public interface Sequencer extends MidiDevice Un sequencer è un dispositivo che cattura ed esegue sequenze di eventi MIDI. Può ad esempio caricare una sequenza da un file MIDI, interrogarne e impostarne il tempo e sincronizzare altri dispositivi Possiede trasmettitori, in quanto è in grado di inviare i messaggi salvati in una sequenza ad altri dispositivi (synth, MIDI OUT). Possiede ricevitori in quanto è in grado di catturare messaggi MIDI e salvarli in una sequenza Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Sintetizzatori public interface Synthesizer extends MidiDevice I sintetizzatori sono gli unici oggetti nel package javax.sound.midi in grado di produrre audio Ogni sintetizzatore controlla un insieme di 16 oggetti “canale MIDI”, ciascuno istanza dell’interfaccia MidiChannel Un’applicazione può generare suono invocando direttamente i metodi degli oggetti “canale MIDI” di un sintetizzatore. Il caso più comune però è che un sintetizzatore generi suono in risposta ai messaggi inviati ai suoi ricevitori Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Strumenti Il sintetizzatore valuta i messaggi che giungono ai suoi ricevitori e quindi invia i comandi corrispondenti (ad es. Note On o Control Change) a uno dei propri oggetti MidiChannel sulla base del numero di canale specificato nell’evento Per generare audio però serve informazione aggiuntiva: lo strumento associato al canale. Lo si fa tramite la classe astratta Instrument Il sintetizzatore deve caricare uno strumento e associarlo a uno o più canali tramite un comando di Program Change. Da quel momento le note inviate a quei canali verranno sintetizzate con lo strumento Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Sintesi del suono in JAVA Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Introduzione La maggior parte dei software in Java che si avvalgono del package hanno l’obiettivo di generare suono L’apparato fin qui descritto, composto da: messaggi eventi (messaggi temporizzati) tracce (insiemi di eventi) sequenze (inziemi di tracce) sequencer (oggetti che manipolano tracce) quasi sempre ha lo scopo di inviare dati musicali a un sintetizzatore che li tradurrà in segnali audio Esistono eccezioni: ad esempio, programmi che visualizzano dati MIDI in formato testuale, o software che li convertono in notazione musicale, o che li inviano a dispositivi esterni tramite porte MIDI Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

L’interfaccia Synthesizer In questa parte della lezione si mostrerà come manipolare un sintetizzatore per far suonare eventi MIDI Esistono vari approcci: Utilizzare un sequencer per inviare dati MIDI al sintetizzatore, eventualmente caricandoli da un file MIDI o generando direttamente la sequenza (vedi lezione precedente) Controllare il sintetizzatore in modo diretto, senza passare attraverso sequencer Usare direttamente oggetti MidiMessage I diversi approcci verranno trattati separatamente Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

L’architettura per la sintesi del suono L’architettura include tre interfacce: Synthesizer MidiChannel Soundbank: concetto introdotto dall’API Java come ulteriore livello gerarchico. I soundbank possono contenere fino a 128 bank, ciascuno contenente fino a 128 strumenti  e quattro classi: Instrument: una specifica per sintetizzare un certo tipo di suono. In GM si definiscono 128 strumenti standard Patch SoundbankResource VoiceStatus: dà informazioni sullo stato corrente (attivo o inattivo) della voce, sul canale MIDI, sul numero di bank e di programma associati, sul numero di nota MIDI e sul volume Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Synthesizer e sequencer di default Sequencer sequencer = MidiSystem.getSequencer(); Synthesizer synthesizer = MidiSystem.getSynthesizer(); Per considerare tutti i dispositivi installati: devices = MidiSystem.getMidiDeviceInfo(); for (MidiDevice.Info info: devices) { ... } Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Caricamento di strumenti Per conoscere gli strumenti attualmente caricati nel sintetizzatore si può invocare il metodo di Synthesizer Instrument[] getLoadedInstruments() Per conoscere gli strumenti caricabili dal soundbank corrente Instrument[] getAvailableInstruments() Per conoscere il nome dei singoli strumenti, si utilizza il metodo getName() di Instrument Il metodo di Synthesizer che restituisce il soundbank di default è Soundbank getDefaultSoundbank() Anche in questo caso, l’interfaccia Soundbank includes metodi per recuperare il nome, il produttore, il numero di versione, ecc. SynthInfo.java Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Approccio 1: uso di sequencer In molti casi, un programma può utilizzare un oggetto Synthesizer quasi senza invocare metodi per la sintesi E’ possibile creare una sequenza manualmente o caricarla da un file MIDI all’interno di un oggetto Sequence. Tale oggetto viene poi caricato da un sequencer, che manda i dati al sintetizzatore di default. Come ottenere il sequencer di default? Usando un metodo statico di MidiSystem: static Sequencer getSequencer() Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Approccio 1: uso di sequencer Ottenere il sequencer di default, acquisire le risorse di sistema richieste e renderlo operativo: Sequencer mioSequencer; mioSequencer = MidiSystem.getSequencer(); if (mioSequencer == null) { // Errore - dispositivo sequencer non supportato } else { mioSequencer.open(); } Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Approccio 1: uso di sequencer Leggere una sequenza da file: si usa il metodo getSequence di MidiSystem, in grado (tramite overload) di caricare una sequenza da InputStream, File, o URL. Il metodo restituisce un oggetto Sequence che può essere caricato in un Sequencer  try { File mioMidiFile = new File("seq1.mid"); Sequence miaSeq = MidiSystem.getSequence(mioMidiFile); mioSequencer.setSequence(miaSeq); } catch (Exception e) // Gestione dell’errore CaricaSequenzaDaFile.java CaricaSequenzaDaUrl.java Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Playback di una sequenza Metodi principali invocabili su oggetti Sequencer: void start() avvia l’esecuzione void stop() mette in pausa l’esecuzione Il metodo setSequence inizializza la posizione corrente del sequencer all’inizio della sequenza Tra i metodi per il riposizionamento: void setMicrosecondPosition(long microseconds) void setTickPosition(long tick) Descrizione completa della classe Sequencer: http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/Sequencer.html Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java

Ulteriori esempi Nel file ZIP della lezione corrente sono state incluse delle varianti agli esercizi sopra commentati SynthInfo2.java dà informazioni su tutti i sintetizzatori trovati nel sistema, non solo su quello di default Per farlo, si cicla su tutti i MidiDevice e si filtrano i risultati tramite l’istruzione if (device instanceof Synthesizer) CaricaSequenzaDaFile2.java permette di scegliere quale traccia ascoltare tra quelle di un MIDI file Se il file è di tipo 1, di solito la 1a traccia è riservata ai metadati e non contiene informazione audio Per farlo si accede alla struttura dati Track[] tracks = miaSeq.getTracks(); e si eliminano tutte le tracce diverse da quella scelta Programmazione MIDI (Prof. Luca A. Ludovico) 23. Dispositivi MIDI in Java