O Pacote Java MIDI Roteiro n Principais Classes

  • Slides: 57
Download presentation
O Pacote Java MIDI

O Pacote Java MIDI

Roteiro n Principais Classes e Interfaces do Pacote MIDI n Acessando Recursos MIDI n

Roteiro n Principais Classes e Interfaces do Pacote MIDI n Acessando Recursos MIDI n Carregando Seqüências MIDI n Transmitindo e Recebendo Mensagens MIDI n Gravando e Editando Seqüências MIDI n Recursos Avançados de Sequencer n Sintetizando Som

Principais Classes e Interfaces do Pacote MIDI

Principais Classes e Interfaces do Pacote MIDI

Classe Midi. Message n Midi. Message é uma classe abstrata que representa uma mensagem

Classe Midi. Message n Midi. Message é uma classe abstrata que representa uma mensagem MIDI pura; n Possui três subclasses: n Short. Messages : tipo mais comum, possui um byte de status e no máximo dois de dados (Ex. : Note On); n Sysex. Messages: podem possuir muito bytes e contém instruções especificas do fabricante; n Meta. Messages: ocorre apenas em arquivos MIDI, contem, por exemplo, configurações de tempo;

Classe Midi. Event n Midi. Event é uma classe que engloba mensagens MIDI puras

Classe Midi. Event n Midi. Event é uma classe que engloba mensagens MIDI puras junto com informação de tempo; n A classe Midi. Event possui métodos para especificar e também obter informação de timestamp: long get. Tick () void set. Tick (long tick)

Classe Sequence n n Sequence representa uma composição musical que pode ser lida de

Classe Sequence n n Sequence representa uma 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 Midi. Events; Sequence Tracks Midi. Events

Interface Midi. Device n n n Objetos que implementem a interface Midi. Device são

Interface Midi. Device n n n Objetos que implementem a interface Midi. Device são capazes de enviar e receber mensagens MIDI; Possui métodos para abrir e fechar um dispositivo; Inclui uma classe interna, Midi. Device. Info, que fornece uma descrição textual do dispositivo;

Interfaces Transmitter e Receiver n n Dispositivos MIDI possuem objetos transmissores e objetos receptores;

Interfaces Transmitter e Receiver n n Dispositivos MIDI possuem objetos transmissores e objetos receptores; Objetos transmissores implementam a interface Transmitter e objetos receptores implementam a interface Receiver;

Interface Sequencer n n n Um sequenciador é um dispositivo para captura e execução

Interface Sequencer n n n Um sequenciador é um dispositivo para captura e execução de seqüências de eventos MIDI; Normalmente, possui tanto transmissores quanto receptores; Sequenciadores implementam a interface Sequencer que é uma subinterface de Midi. Device;

Interface Synthesizer n n n Sintetizadores implementam a interface Synthesizer (subinterface de Midi. Device);

Interface Synthesizer n n n Sintetizadores implementam a interface Synthesizer (subinterface de Midi. Device); Um sintetizador possui canais, representados por objetos que implementem a interface Midi. Channel; Normalmente um sintetizador gera sons em resposta a mensagens enviadas aos seus receptores;

Acessando Recursos MIDI

Acessando Recursos MIDI

Classe Midi. System n n Assim como a classe Audio. System, permite descobrir e

Classe Midi. System n n Assim como a classe Audio. System, permite descobrir e acessar os dispositivos instalados no sistema; Permite obter os seguintes recursos: n n n Sequenciadores; Sintetizadores; Transmissores; Receptores; Dados a partir de arquivos MIDI; Dados a partir de arquivos de soundbank;

Obtendo Dispositivos Padrões n n Uma aplicação típica inicia obtendo os dispositivos necessários (sequenciadores,

Obtendo Dispositivos Padrões n n Uma aplicação típica inicia obtendo os dispositivos necessários (sequenciadores, sintetizadores, etc. ); A classe Midi. System inclui métodos para obter dispositivos padrão: n n static Sequencer get. Sequencer (); static Synthesizer get. Synthesizer (); static Receiver get. Receiver (); static Transmitter get. Transmitter ();

Obtendo Dispositivos Instalados n A classe Midi. System possui um método para obter informações

Obtendo Dispositivos Instalados n A classe Midi. System possui um método para obter informações sobre os dispositivos instalados: static Midi. Device. Info[] get. Midi. Device. Info () n Para obter um dispositivo deve-se utilizar o método: static Midi. Device get. Midi. Device (Midi. Device. Info info)

Exemplo 1: Obtendo os sintetizadores instalados Vector synth. Info; Midi. Device device; Midi. Device.

Exemplo 1: Obtendo os sintetizadores instalados Vector synth. Info; Midi. Device device; Midi. Device. Info[] infos = Midi. System. get. Midi. Device. Info (); for (int i = 0; i < infos. length; i++) { try { device = Midi. System. get. Midi. Device (infos[i]); } catch (Midi. Unavailable. Exception e) { // tratar ou throw a exceção } if (device instanceof Synthesizer) { synth. Infos. add (infos[i]); } }

Abrindo Dispositivos n Para reservar um dispositivo : método open() da interface Midi. Device:

Abrindo Dispositivos n Para reservar um dispositivo : método open() da interface Midi. Device: if (!device. is. Open ()) { try { device. open (); } catch (Midi. Unavailable. Exception e) { // tratar ou throw a exceção } }

Carregando Seqüências MIDI

Carregando Seqüências MIDI

Carregando um Arquivo MIDI n Duas maneiras: n Carregar um arquivo MIDI em um

Carregando um Arquivo MIDI n Duas maneiras: n Carregar um arquivo MIDI em um Input. Stream e depois usar: Sequencer. set. Sequence (Input. Stream stream) n Criar, explicitamente, um objeto Sequence e depois carregá-lo em um Sequencer (Necessário quando se deseja editar uma seqüência MIDI)

Exemplo 2: Criando e Carregando um Objeto Sequence try { File midi. File =

Exemplo 2: Criando e Carregando um Objeto Sequence try { File midi. File = new File (“seq 1. mid”); Sequence seq = Midi. System. get. Sequence (midi. File); sequencer. set. Sequence (seq); } catch (Exception e) { // tratar ou throw a exceção }

Transmitindo e Recebendo Mensagens MIDI

Transmitindo e Recebendo Mensagens MIDI

Dispositivos, Receptores e Transmissores n n n Diferentes Midi. Device podem ser interconectados possibilitando

Dispositivos, Receptores e Transmissores n n n Diferentes Midi. Device podem ser interconectados possibilitando que dados fluam entre eles; Midi. Device possui um ou mais objetos auxiliares que implementam as interfaces Transmitter ou Receiver; Cada transmissor só pode ser conectado a um receptor e vice-versa;

Conectando-se a um Dispositivo n A interface Transmitter possui um método que permite estabelecer

Conectando-se a um Dispositivo n A interface Transmitter possui um método que permite estabelecer a conexão com o Receiver para o qual serão enviadas as mensagens: void set. Receiver (Receiver receiver) n Após terminada a conexão deve-se invocar o método close() de Transmitter e Receiver para que os mesmos sejam liberados;

Exemplo 2: Conectando um Sequenciador a um Sintetizador Sequencer seq; Transmitter seq. Trans; Synthesizer

Exemplo 2: Conectando um Sequenciador a um Sintetizador Sequencer seq; Transmitter seq. Trans; Synthesizer synth; Receiver synth. Rcvr; try { seq = Midi. System. get. Sequencer (); seq. Trans = seq. get. Transmitter (); synth = Midi. System. get. Synthesizer (); synth. Rcvr = synth. get. Receiver (); seq. Trans. set. Receiver (synth. Rcvr); } catch (Midi. Unavailable. Exception e) { // tratar ou throw a exceção }

Exercício 1 n Abrir e tocar um arquivo MIDI;

Exercício 1 n Abrir e tocar um arquivo MIDI;

Como enviar a mesma mensagem para diferentes dispositivos ? n n Basta usar mais

Como enviar a mesma mensagem para diferentes dispositivos ? n n Basta usar mais de um transmissor e mais de um receptor; Midi. Device possui métodos para descobrir quantos transmissores e receptores um dispositivo suporta: int get. Max. Transmitters () int get. Max. Receivers ()

Exemplo 3: Conectando um Porta de Entrada a um Sequenciador e a um Sintetizador

Exemplo 3: Conectando um Porta de Entrada a um Sequenciador e a um Sintetizador Sequencer seq; Synthesizer synth; Midi. Device input. Port; // Obter e abrir os três dispositivos Transmitter in. Port. Trans 1, in. Port. Trans 2; Receiver synth. Rcvr, seq. Receiver; try { in. Port. Trans = input. Port. get. Transmitter (); synth. Rcvr = synth. get. Receiver (); in. Port. Trans 1. set. Receiver (synth. Rcvr); in. Port. Trans 2 = input. Port. get. Transmitter (); seq. Rcvr = seq. get. Receiver (); in. Port. Trans 2. set. Receiver (seq. Rcvr); } catch (Midi. Unavailable. Exception e) { // tratar ou throw a exceção }

Quando Usar um Sequenciador n n É possível enviar mensagens MIDI diretamente para um

Quando Usar um Sequenciador n n É possível enviar mensagens MIDI diretamente para um dispositivo sem usar um sequenciador; Essa técnica pode ser utilizada quando o próprio programa cria as mensagens em tempo real; n n Ex. : Programa que simula um piano Sequenciadores são utilizados para lidar com dados lidos de um arquivo MIDI e também para gravar dados MIDI;

Enviando Mensagem para um Receptor sem Usar um Transmissor n A interface Receiver contém

Enviando Mensagem para um Receptor sem Usar um Transmissor n A interface Receiver contém um método que envia mensagens para o receptor: void send (Midi. Message message, long time. Stamp) n Criar um objeto Short. Message e usar o método: Void set. Message (int command, int channel, int data 1, int data 2)

Exemplo 4: Enviando uma Mensagem sem Usar um Transmissor Short. Message msg = new

Exemplo 4: Enviando uma Mensagem sem Usar um Transmissor Short. Message msg = new Short. Message (); // Tocar a nota Middle C (60) com velocidade = 93 msg. set. Message (Short. Message. NOTE_ON, 0, 60, 93); long time. Stamp = -1; Receiver rcvr = Midi. System. get. Receiver (); Rcvr. send (msg, time. Stamp);

Exercício 2 n Enviar mensagens MIDI diretamente para um sintetizador sem usar um Sequenciador

Exercício 2 n Enviar mensagens MIDI diretamente para um sintetizador sem usar um Sequenciador

Roteiro n Principais Classes e Interfaces do Pacote MIDI n Acessando Recursos MIDI n

Roteiro n Principais Classes e Interfaces do Pacote MIDI n Acessando Recursos MIDI n Carregando Seqüências MIDI n Transmitindo e Recebendo Mensagens MIDI n Gravando e Editando Seqüências MIDI n Recursos Avançados de Sequencer n Sintetizando Som

Gravando e Editando Seqüências MIDI

Gravando e Editando Seqüências MIDI

Tracks n n n Arquivos MIDI são organizados em tracks; Normalmente cada track contem

Tracks n n n Arquivos MIDI são organizados em tracks; Normalmente cada track contem as notas de um único instrumento (não é obrigado pelo padrão); Arquivos MIDI são organizados em uma hierarquia de três níveis: n n n Sequence; Track; Midi. Events; Sequence Tracks Midi. Events

Midi. Events e Ticks n n n Em um Midi. Event o tempo é

Midi. Events e Ticks n n n Em um Midi. Event o tempo é expresso tendo como base o conceito de tick; A duração de um tick varia de acordo com a sequência MIDI e seu valor é armazenado no cabeçalho de um arquivo MIDI; O tamanho de um tick pode ser dado em duas unidades: n n n Pulsos por quarto de nota (PPQ) Ticks por frame (SMPTE) Na API Java os valores de tick medem tempo cumulativo;

Gravando e Salvando Sequences (1/2) 1. 2. 3. Obtenha um Sequencer através de Midi.

Gravando e Salvando Sequences (1/2) 1. 2. 3. Obtenha um Sequencer através de Midi. System; Estabeleça a conexão entre o Sequencer e o objeto que transmitirá as mensagens MIDI; Crie um novo objeto Sequence: Sequence (float division. Type, int resolution ) Sequence (float division. Type, int resolution, int num. Tracks ) 4. Crie um objeto Track caso isso não seja feito no construtor: Sequence. create. Track();

Gravando e Salvando Sequences (2/2) 5. Relacione o objeto Sequence criado com o Sequencer

Gravando e Salvando Sequences (2/2) 5. Relacione o objeto Sequence criado com o Sequencer usado: Sequencer. set. Sequence(Sequence sequence) 6. Chame o método Sequencer. record. Enable (); 7. Chame o método Sequence. start. Recording (); 8. 9. Quando terminar, chame Sequencer. stop () ou Sequencer. stop. Recording (); Salve o objeto Sequence gravado usando Midid. System. write();

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

Editando uma Seqüência n n Objetos do tipo Sequence permitem que sejam adicionados ou removidos Tracks: n Track create. Track () n Boolean delete. Track (Track track) As Tracks são armazenadas em um objeto Sequence através de um Vector;

Editando uma Seqüência n n Os Midi. Events contidos em uma Track também são

Editando uma Seqüência n n Os Midi. Events contidos em uma Track também são armazenados em um Vector; Os métodos de Track são: n n n boolean add (Midi. Event event) Midi. Event get (int index) boolean remove (Midi. Event event) int size () long ticks ()

Exercício 3 n Criar alguns eventos MIDI, com mensagens Note On e Note Off,

Exercício 3 n Criar alguns eventos MIDI, com mensagens Note On e Note Off, e gravá-los em um SMF (Usar PPQ com, por exemplo, resolução 12;

Recursos Avançados de Sequencer

Recursos Avançados de Sequencer

Posição de uma Sequence n Obtendo a posição corrente do Sequencer em um Sequence:

Posição de uma Sequence n Obtendo a posição corrente do Sequencer em um Sequence: n n n Long get. Tick. Position () Long get. Microsecond. Position () Movendo para um ponto arbitrário em um objeto Sequence: n n void set. Tick. Position (long Tick) void set. Microsecond. Position (long microsecond)

Mudando a Velocidade de Execução n n A velocidade de uma seqüência é indicada

Mudando a Velocidade de Execução n n A velocidade de uma seqüência é indicada pelo seu tempo; Pode-se mudar o tempo de uma seqüência através de eventos MIDI ou através da chamada de métodos de Sequencer: n n n void set. Tempo. In. BPM (float bpm) void set. Tempo. In. MPQ (float mpq) void set. Tempo. Factor (float factor)

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

Mute e Solo em Tracks n Pode-se escolher que Tracks irão contribuir para o stream de mensagens MIDI gerados pelo Sequencer; void set. Track. Mute (int track, boolean mute) void set. Track. Solo (int track, boolean solo) n Para verificar o status de uma Track: n n boolean get. Track. Mute (int track) boolean get. Track. Solo (int track)

Sincronizando com Outros Dispositivos n Sequencer possui uma classe interna Sequencer. Sync. Mode que

Sincronizando com Outros Dispositivos n Sequencer possui uma classe interna Sequencer. Sync. Mode que representa os modos como um Sequencer pode ser sincronizado; n Um Sequencer pode ser sincronizado como Master e/ou Slave: n n void set. Master. Sync. Mode (Sequencer. Sync. Mode sync) void set. Slave. Sync. Mode (Sequencer. Sync. Mode sync)

Listeners par Eventos Especiais n Especificando Listeners para eventos especiais: n n Int[] add.

Listeners par Eventos Especiais n Especificando Listeners para eventos especiais: n n Int[] add. Controller. Event. Listener (Controller. Event. Listener listener, int[] controllers) Boolean add. Meta. Event. Listener (Meta. Event. Listener listener)

Exercício 4 n Alterar o tocador MIDI de modo que seja possível executar Mute

Exercício 4 n Alterar o tocador MIDI de modo que seja possível executar Mute e Solo em Tracks especificas;

Sintetizando Som

Sintetizando Som

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

A Síntese de Sons em Java n A arquitetura para síntese de sons em Java é composta de três interfaces n n Synthesizer Midi. Channel Soundbank E quatro classes: n n Instrument Patch Soundbank. Resource Voice. Status

Verificando Quais Instrumentos Estão Carregados n Para carregar o Soundbank padrão deve-se usar o

Verificando Quais Instrumentos Estão Carregados n Para carregar o Soundbank padrão deve-se usar o seguinte método de Synthesizer: Soundbank get. Default. Soundbank () n Para descobrir quais instrumentos estão atualmente carregados deve-se usar o seguinte método de Synthesizer: Instrument[] get. Loaded. Instruments()

Carregando Instrumentos n Para descobrir quais instrumentos pertencem ao Sintetizador: Instrument[] get. Available. Instruments

Carregando Instrumentos n Para descobrir quais instrumentos pertencem ao Sintetizador: Instrument[] get. Available. Instruments () n Um instrumento pode ser carregado usando: boolean load. Instrument (Intrument instrument) n O instrumento será carregado na posição especificada pelo seu objeto Patch;

Carregando Instrumentos n n n Cada objeto do tipo Instrument possui um objeto Patch

Carregando Instrumentos n n n 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 remap. Intrument (Intrument from, Instrument to)

Descarregando Instrumentos n Existem três métodos para descarregar instrumentos: n void unload. All. Instruments

Descarregando Instrumentos n Existem três métodos para descarregar instrumentos: n void unload. All. Instruments (Soundbank soundbank) n void unload. Instrument(Instrument instrument) n void unload. Instruments(Soundbank soundbank, Patch[] patch. List)

Acessando Canais n Existem 2 maneiras para controlar o sintetizador sem usar um sequenciador:

Acessando Canais n Existem 2 maneiras para controlar o sintetizador sem usar um sequenciador: n n Como já foi visto, pode-se enviar uma mensagem diretamente a um receptor do sintetizador através do método send (); Outra opção seria interagir diretamente com objetos Midi. Channel;

Exemplo 6: Exemplo 4 Usando Canais Synthesizer synth = Midi. System. get. Synthesizer ();

Exemplo 6: Exemplo 4 Usando Canais Synthesizer synth = Midi. System. get. Synthesizer (); // Obtem todos os canais do sintetizador Midi. Channel chan[] = synth. get. Channels (); // Checa se o canal existe if (chan[4] != null) { chan[4]. note. On (60, 93); }

Mute e Solo em Canais n n n A API Java Sound adiciona a

Mute e Solo em Canais n n n A API Java Sound adiciona a noção de Solo e Mute por canais; Essa operação é similar as de Mute e Solo para Tracks; São fornecidos quatro métodos: n n boolean get. Mute () boolean get. Solo () void set. Mute (boolean mute. State) void set. Solo (boolean solo. State)

Alterando o Instrumento de um Canal n n Para descobrir qual o instrumento atualmente

Alterando o Instrumento de um Canal n n Para descobrir qual o instrumento atualmente alocado a um canal deve-se usar: int get. Program () Para modificar o instrumento associado: void program. Change (int program) OBS. : Instrumento deve estar carregado no sintetizador !

Exercício 5 n Enviar mensagens Note On e Note Off diretamente para o canal

Exercício 5 n Enviar mensagens Note On e Note Off diretamente para o canal de um sintetizador (sem usar Midi. Messages). Permitir também a mudança de Instrumentos;