o pacote java midi. roteiro principais classes e interfaces do pacote midi acessando recursos midi...

46
O Pacote Java MIDI

Upload: internet

Post on 19-Apr-2015

111 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

O Pacote Java MIDI

Page 2: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Roteiro Principais Classes e Interfaces do Pacote MIDI

Acessando Recursos MIDI

Carregando Seqüências MIDI

Transmitindo e Recebendo Mensagens MIDI

Gravando e Editando Seqüências MIDI

Recursos Avançados de Sequencer

Sintetizando Som

Page 3: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Principais Classes e Interfaces do Pacote MIDI

Page 4: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Classe MidiMessage MidiMessage

classe abstrata que representa uma mensagem MIDI pura

3 subclasses: ShortMessages : tipo mais comum, possui um byte de

status e no máximo dois de dados (Ex.: Note On) SysexMessages: podem possuir muito bytes e contém

instruções especificas do fabricante MetaMessages: ocorre apenas em SMF, contem, por

exemplo, letra da música

Page 5: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Classe MidiEvent

MidiEvent Mensagens MIDI + momento em que

ocorre Métodos para especificar e

também obter informação de tempo: long getTick () void setTick (long tick)

Page 6: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Classe Sequence Sequence

Composição musical que pode ser lida de um arquivo ou criada em tempo real

É composto por uma coleção de Tracks onde estão armazenados os MidiEvents

Sequence

Tracks

MidiEvents

Page 7: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Interface MidiDevice São capazes de enviar e receber

mensagens MIDI Métodos para reservar (open) e liberar

(close) o uso do dispositivo MidiDevice.Info

fornece uma descrição textual do dispositivo; Objetos transmissores implementam a

interface Transmitter e objetos receptores implementam a interface Receiver

Page 8: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Interface Sequencer

Dispositivo para captura e execução de seqüências de eventos MIDI Responsável por manter os dados

sincronizados Possui transmissores e receptores Sequencer é uma subinterface de MidiDevice

Page 9: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Interface Synthesizer

Representa o dispositivo que efetivamente produz a onda sonora

Subinterface de MidiDevice Um sintetizador possui canais

Interface MidiChannel Possui apenas receptores

Page 10: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Acessando Recursos MIDI

Page 11: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Classe MidiSystem Similar ao AudioSystem do pacote

sampled Permite obter os seguintes recursos:

Sequenciadores Sintetizadores Transmissores Receptores Dados a partir de arquivos MIDI Dados a partir de arquivos de soundbank

Page 12: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Obtendo Dispositivos Padrões

Uma aplicação típica inicia obtendo os dispositivos necessários (sequenciadores, sintetizadores, etc.)

Métodos para obter dispositivos padrão: static Sequencer getSequencer (); static Synthesizer getSynthesizer (); static Receiver getReceiver (); static Transmitter getTransmitter ();

Page 13: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Exemplo 1

Obtendo informações sobre os MidiDevices Exercício 1: Listar apenas os

Sintetizadores

Page 14: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Carregando Seqüências MIDI

Page 15: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Criando e Carregando um Objeto Sequence

try {

File midiFile = new File (“seq1.mid”);

Sequence seq = MidiSystem.getSequence (midiFile);

sequencer.setSequence (seq);

} catch (Exception e) {

// tratar ou throw a exceção

}

Page 16: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Transmitindo e Recebendo Mensagens MIDI

Page 17: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Dispositivos, Receptores e Transmissores

Diferentes MidiDevice podem ser interconectados

Um MidiDevice possui um ou mais objetos com interface Transmitter e/ou Receiver;

Cada transmissor só pode ser conectado a um receptor e vice-versa;

Page 18: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Conectando-se a um Dispositivo

Interface Transmitter void setReceiver (Receiver receiver)

Após terminada a conexão deve-se invocar o método close() de Transmitter e Receiver para que os mesmos sejam liberados;

Page 19: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Exercício 2

Abrir e tocar um arquivo MIDI

Page 20: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Como enviar a mesma mensagem para diferentes dispositivos ?

Usando mais de um transmissor e mais de um receptor

MidiDevice possui métodos para descobrir quantos transmissores e receptores um dispositivo suporta:

int getMaxTransmitters () int getMaxReceivers ()

Page 21: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Exemplo 2: Conectando uma Porta de Entrada a um Sequenciador e a um Sintetizador

Sequencer seq;Synthesizer synth;MidiDevice inputPort;// Obter e abrir os três dispositivosTransmitter inPortTrans1, inPortTrans2;Receiver synthRcvr, seqReceiver;

try {inPortTrans = inputPort.getTransmitter ();synthRcvr = synth.getReceiver ();inPortTrans1.setReceiver (synthRcvr);inPortTrans2 = inputPort.getTransmitter ();seqRcvr = seq.getReceiver (); inPortTrans2.setReceiver (seqRcvr);

} catch (MidiUnavailableException e) {// tratar ou throw a exceção

}

Page 22: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Enviando Mensagem para um Receptor sem Usar um Transmissor

Receiver contém um método que envia mensagens para o receptor void send (MidiMessage message, long timeStamp)

Criar um objeto ShortMessage e usar o método void setMessage (int command, int channel, int data1, int data2)

Page 23: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Exemplo 3:

Enviando uma Mensagem sem Usar um Transmissor

Exercício 3 FileToMIDI : Lê arquivo qualquer e toca seus

bytes como Notas Monofônico Para cada note ON, existe um note OFF

correspondente As notas tem a mesma duração

Page 24: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Roteiro Principais Classes e Interfaces do Pacote MIDIPrincipais Classes e Interfaces do Pacote MIDI

Acessando Recursos MIDIAcessando Recursos MIDI

Carregando Seqüências MIDICarregando Seqüências MIDI

Transmitindo e Recebendo Mensagens MIDITransmitindo e Recebendo Mensagens MIDI

Gravando e Editando Seqüências MIDI

Recursos Avançados de Sequencer

Sintetizando Som

Page 25: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Gravando e Editando Seqüências MIDI

Page 26: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Tracks Arquivos MIDI são organizados em tracks Normalmente, cada track agrupa

informações que possuem forte relação entre si Notas de determinado instrumento

Arquivos MIDI são organizados em uma hierarquia de três níveis:

Sequence Track MidiEvents

Sequence

Tracks

MidiEvents

Page 27: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

MidiEvents e Ticks Em um MidiEvent o tempo é expresso em

ticks, que é o menor intervalo de tempo em um SMF

O tamanho de um tick é um valor relativo pode ser dado em duas unidades:

Pulsos por semínima (PPQ) Ticks por frame (SMPTE)

O valor absoluto do tick é calculado no momento do sequenciamento

Na API Java os valores de tick medem tempo cumulativo;

Page 28: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Gravando e Salvando Sequences (1/2)

1. Obtenha um Sequencer através de MidiSystem;

2. Estabeleça a conexão entre o Sequencer e o objeto que transmitirá as mensagens MIDI;

3. Crie um novo objeto Sequence:Sequence (float divisionType, int resolution )Sequence (float divisionType, int resolution,

int numTracks )

4. Crie um objeto Track caso isso não seja feito no construtor:

Sequence.createTrack();

Page 29: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Gravando e Salvando Sequences (2/2)

5. Relacione Sequence com o Sequencer usando:Sequencer.setSequence(Sequence sequence)

6. Chame o método Sequencer.recordEnable ();7. Chame o método Sequence.startRecording ();8. Quando terminar, chame Sequencer.stop () ou

Sequencer.stopRecording ();9. Salve o objeto Sequence gravado usando

MididSystem.write();

Page 30: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Editando uma Seqüência Objetos do tipo Sequence permitem que sejam

adicionados ou removidos Tracks: Track createTrack () Boolean deleteTrack (Track track)

As Tracks são armazenadas em um objeto Sequence através de um Vector;

Page 31: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Editando uma Seqüência Os MidiEvents contidos em uma Track também

são armazenados em um Vector Métodos de Track

boolean add (MidiEvent event) MidiEvent get (int index) boolean remove (MidiEvent event) int size () long ticks ()

Page 32: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Exercício 4 Gravar Exercício 3 em arquivo

Formato 1 120 PPQ Tick é acumulativo

Page 33: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Recursos Avançados de Sequencer

Page 34: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Posição de uma Sequence

Obtendo a posição corrente do Sequencer em um Sequence:

Long getTickPosition () Long getMicrosecondPosition ()

Movendo para um ponto arbitrário em um objeto Sequence:

void setTickPosition (long Tick) void setMicrosecondPosition (long

microsecond)

Page 35: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Mudando a Velocidade de Execução

A velocidade de uma seqüência é indicada pelo seu andamento (tempo)

Pode-se mudar o andamento de uma seqüência através de eventos MIDI ou através da chamada de métodos de Sequencer: void setTempoInBPM (float bpm) void setTempoInMPQ (float mpq) void setTempoFactor (float factor)

Page 36: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Mute e Solo em Tracks Pode-se escolher que Tracks irão contribuir

para o stream de mensagens MIDI gerados pelo Sequencer;void setTrackMute (int track, boolean mute)

void setTrackSolo (int track, boolean solo)

Para verificar o status de uma Track: boolean getTrackMute (int track) boolean getTrackSolo (int track)

Page 37: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Exercício 5 Adicionar código ausente no MidiPlayer

Pause e Parar Acelerar 2x Aplicar Mute e Solo em alguma track

Page 38: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Sintetizando Som

Page 39: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

A Síntese de Sons em Java A arquitetura para síntese de sons em Java é

composta de três interfaces Synthesizer MidiChannel Soundbank

E quatro classes: Instrument Patch SoundbankResource VoiceStatus

Page 40: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Verificando Quais Instrumentos Estão Carregados Soundbank é um repositório de Instruments Instruments são classes responsáveis pela síntese do

som Além de determinar seu Patch (posição na memória do

Sintetizador) O Patch tem dois componentes: o Bank e o Program que

funcionam como índices (2 dimensões) na memória do sintetizador

Cada bank possui até 128 programs Para carregar o Soundbank padrão deve-se usar o

seguinte método de Synthesizer:Soundbank getDefaultSoundbank ()          

Para descobrir quais instrumentos estão atualmente carregados deve-se usar o seguinte método de Synthesizer:Instrument[] getLoadedInstruments()

Page 41: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Carregando Instrumentos Para descobrir quais instrumentos pertencem

ao Sintetizador:Instrument[] getAvailableInstruments ()

Um instrumento pode ser carregado usando:boolean loadInstrument (Intrument instrument)

O instrumento será carregado na posição especificada pelo seu objeto Patch;

Page 42: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Carregando Instrumentos

Cada objeto do tipo Instrument possui um objeto Patch que especifica onde o instrumento deverá ser carregado;

Esse local é definido pelo número do banco e número do programa;

É possível carregar o instrumento em um outro local através do seguinte método de Synthesizer:

boolean remapIntrument (Intrument from, Instrument to)

Page 43: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Descarregando Instrumentos

Existem três métodos para descarregar instrumentos:

 void unloadAllInstruments (Soundbank soundbank)

 void unloadInstrument(Instrument instrument)

 void unloadInstruments(Soundbank soundbank, Patch[] patchList)

Page 44: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Acessando Canais Existem 2 maneiras para controlar o

sintetizador sem usar um sequenciador: Através do seu Receiver Interagir direta com objetos MidiChannel

Page 45: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Alterando o Instrumento de um Canal

Para descobrir qual o instrumento atualmente alocado a um canal deve-se usar:int getProgram ()

Para modificar o instrumento associado:void programChange (int program)void programChange(int bank,int program)

OBS.: Instrumento deve estar carregado no sintetizador !

Page 46: O Pacote Java MIDI. Roteiro Principais Classes e Interfaces do Pacote MIDI Acessando Recursos MIDI Carregando Seqüências MIDI Transmitindo e Recebendo

Exercício 6

Adicionar código ao programa TocaNotas para enviar mensagens Note On e Note Off diretamente para o canal de um sintetizador (sem usar MidiMessages). Permitir também a mudança de Instrumentos;