O Pacote Java MIDI Roteiro n Principais Classes

  • Slides: 46
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 n classe abstrata que representa uma mensagem MIDI pura 3

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

Classe Midi. Event n n Mensagens MIDI + momento em que ocorre Métodos para

Classe Midi. Event n n Mensagens MIDI + momento em que ocorre Métodos para especificar e também obter informação de tempo: n n long get. Tick () void set. Tick (long tick)

Classe Sequence n n Composição musical que pode ser lida de um arquivo ou

Classe Sequence n n 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 São capazes de enviar e receber mensagens MIDI Métodos

Interface Midi. Device n n São capazes de enviar e receber mensagens MIDI Métodos para reservar (open) e liberar (close) o uso do dispositivo Midi. Device. Info n fornece uma descrição textual do dispositivo; Objetos transmissores implementam a interface Transmitter e objetos receptores implementam a interface Receiver

Interface Sequencer n Dispositivo para captura e execução de seqüências de eventos MIDI n

Interface Sequencer n Dispositivo para captura e execução de seqüências de eventos MIDI n n n Responsável por manter os dados sincronizados Possui transmissores e receptores Sequencer é uma subinterface de Midi. Device

Interface Synthesizer n Representa o dispositivo que efetivamente produz a onda sonora Subinterface de

Interface Synthesizer n Representa o dispositivo que efetivamente produz a onda sonora Subinterface de Midi. Device n Um sintetizador possui canais n n n Interface Midi. Channel Possui apenas receptores

Acessando Recursos MIDI

Acessando Recursos MIDI

Classe Midi. System n Similar ao Audio. System do pacote sampled n Permite obter

Classe Midi. System n Similar ao Audio. System do pacote sampled n 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. ) Métodos para obter dispositivos padrão: n n static Sequencer get. Sequencer (); Synthesizer get. Synthesizer (); Receiver get. Receiver (); Transmitter get. Transmitter ();

Exemplo 1 n n Obtendo informações sobre os Midi. Devices Exercício 1: Listar apenas

Exemplo 1 n n Obtendo informações sobre os Midi. Devices Exercício 1: Listar apenas os Sintetizadores

Carregando Seqüências MIDI

Carregando Seqüências MIDI

Criando e Carregando um Objeto Sequence try { File midi. File = new File

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 Um

Dispositivos, Receptores e Transmissores n n n Diferentes Midi. Device podem ser interconectados Um Midi. Device possui um ou mais objetos com interface Transmitter e/ou Receiver; Cada transmissor só pode ser conectado a um receptor e vice-versa;

Conectando-se a um Dispositivo n Interface Transmitter n n void set. Receiver (Receiver receiver)

Conectando-se a um Dispositivo n Interface Transmitter n n void set. Receiver (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;

Exercício 2 n Abrir e tocar um arquivo MIDI

Exercício 2 n Abrir e tocar um arquivo MIDI

Como enviar a mesma mensagem para diferentes dispositivos ? n n Usando mais de

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

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

Exemplo 2: Conectando uma 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 }

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

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

Exemplo 3: n n Enviando uma Mensagem sem Usar um Transmissor Exercício 3 n

Exemplo 3: n n Enviando uma Mensagem sem Usar um Transmissor Exercício 3 n File. To. MIDI : Lê arquivo qualquer e toca seus bytes como Notas n n n Monofônico Para cada note ON, existe um note OFF correspondente As notas tem a mesma duração

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 Arquivos MIDI são organizados em tracks Normalmente, cada track agrupa informações

Tracks n n Arquivos MIDI são organizados em tracks Normalmente, cada track agrupa informações que possuem forte relação entre si n n Notas de determinado instrumento 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 Em um Midi. Event o tempo é expresso

Midi. Events e Ticks n n Em um Midi. Event 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: n n 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;

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 Sequence com o Sequencer usando: Sequencer. set.

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

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

Editando uma Seqüência n Objetos do tipo Sequence permitem que sejam adicionados ou removidos Tracks: n n n Track create. Track () 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 Métodos de Track n n n boolean add (Midi. Event event) Midi. Event get (int index) boolean remove (Midi. Event event) int size () long ticks ()

Exercício 4 n Gravar Exercício 3 em arquivo n n n Formato 1 120

Exercício 4 n Gravar Exercício 3 em arquivo n n n Formato 1 120 PPQ Tick é acumulativo

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 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: 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)

Exercício 5 n Adicionar código ausente no Midi. Player n n n Pause e

Exercício 5 n Adicionar código ausente no Midi. Player n n n Pause e Parar Acelerar 2 x Aplicar Mute e Solo em alguma track

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 n Soundbank é um repositório de Instruments são

Verificando Quais Instrumentos Estão Carregados n n Soundbank é um repositório de Instruments são classes responsáveis pela síntese do som n n O Patch tem dois componentes: o Bank e o Program que funcionam como índices (2 dimensões) na memória do sintetizador n n Além de determinar seu Patch (posição 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 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 n n void unload.

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

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

Acessando Canais n n n Existem 2 maneiras para controlar o sintetizador sem usar um sequenciador: Através do seu Receiver Interagir direta com objetos Midi. Channel

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) void program. Change(int bank, int program) OBS. : Instrumento deve estar carregado no sintetizador !

Exercício 6 n Adicionar código ao programa Toca. Notas para enviar mensagens Note On

Exercício 6 n Adicionar código ao programa Toca. Notas para 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;