O Pacote Java MIDI Roteiro n Principais Classes
- Slides: 57
O Pacote Java MIDI
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
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 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 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 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; 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 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); 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
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, 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 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. 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: if (!device. is. Open ()) { try { device. open (); } catch (Midi. Unavailable. Exception e) { // tratar ou throw a exceção } }
Carregando Seqüências MIDI
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 = 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
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 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 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;
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 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 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 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 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
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
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 é 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. 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 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 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 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, e gravá-los em um SMF (Usar PPQ com, por exemplo, resolução 12;
Recursos Avançados de Sequencer
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 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 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 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. 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 e Solo em Tracks especificas;
Sintetizando Som
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 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 () 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 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 (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: 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 (); // 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 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 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 de um sintetizador (sem usar Midi. Messages). Permitir também a mudança de Instrumentos;
- A terra atrai um pacote de arroz
- Multivivo
- Pre ap classes vs regular classes
- Subclasse de palavras
- Rtp midi
- Recipeml
- Roteiro para palestra
- Midi stands for
- Siguema
- Roteiro de telejornal pronto
- Ipeak roteiro de estudos
- Bandtrax
- Midi vs digital audio
- Escatologia intermedia
- Roteiro de reunião formal das equipes de nossa senhora
- Roteiro de feedback
- Oxford midi hoist dimensions
- Pic du midi d'ossau mariano
- Draaiorgel midi files
- Programmazione midi
- Hino das santas missões populares
- Steve reich midi files
- Tomates verdes fritos roteiro
- Classroom
- Roteiro de apresentação dia das mães
- Onss gare du midi
- Roteiro para vibrações coletivas
- Midi channel voice messages
- Programmazione midi
- Roteiro de palestra
- Roteiro onomasiológico
- Roteiro pitch
- Perfil de personagem roteiro
- Midi signals are digitized audio samples points
- Roteiro de teatro curto
- General midi map
- Java script classes
- Abstract classes in java
- Java foundation classes
- Writing classes java
- Adapter class in java
- Abstract classes java
- Abstract classes in java
- Moluscos corpo
- Quais as principais características do taylorismo
- Handebol posições
- Bioma pantanal
- O poeta romantico deixa-se arrebatar
- Romantismo e suas características
- Jeffrey sachs
- Principais autores do arcadismo
- Climograma do semiárido
- Andar verbo copulativo
- Os dois principais rios que alimentavam o mar de aral
- Choque de civilizações
- Principais conjunções
- Exemplos de sonetos
- Tipos de hormonas endocrinas