Você está aqui: Java ::: Pacote javax.sound.midi ::: Aplicações com código fonte completo

Como tocar uma sequência de notas MIDI usando Java

Quantidade de visualizações: 96 vezes
Nesta dica eu mostrarei um código Java completo que tira proveito das classes do pacote javax.sound.midi para tocar a escala de dó maior em uma guitarra envenenada com distorção à la Slash. Veja que maravilha! Não precisaremos instalar nada. Tudo que precisamos já está pronto na instalação padrão do Java SDK.

Trata-se de uma aplicação MIDI completa que, embora simples, é o ponto de partida para a criação de afinadores de guitarra e baixo, um jogo educativo ou até, quem sabe, a sua própria versão do famoso Guitar Pro.

O código está em Java console, mas pode ser facilmente adaptado para Java Swing ou JavaFX, que permitem uma maior interação com o mouse e teclado, além de oferecerem um visual mais bonito e intuitivo.

Veja a listagem completa, repleta de comentários e observações a partir da perspectiva de um programador e músico:

package arquivodecodigos;

import javax.sound.midi.Instrument;
import javax.sound.midi.MidiChannel;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.Synthesizer;

public class Estudos {
  public static void main(String[] args) {
    try{
      // vamos obter o sintetizador MIDI e abrí-lo
      Synthesizer sintetizador = MidiSystem.getSynthesizer();
      sintetizador.open();

      // vamos obter a lista de instrumentos MIDI disponíveis
      Instrument[] instrumentos = 
        sintetizador.getDefaultSoundbank().getInstruments();

      // vamos criar um canal para a guitarra "Distortion Guitar"
      MidiChannel canalGuitarra = sintetizador.getChannels()[0];
      // mudamos o programa pra refletir o instrumento escolhido
      // Distortion Guitar é o instrumento 31 na especificação MIDI, então
      // temos que usar 30 (lembra, né? Em Java os vetoes começam em 0)
      canalGuitarra.programChange(instrumentos[30].getPatch().getProgram());

      // vamos definir a escala de dó maior
      // lembre-se: Tom - Tom - Semitom - Tom - Tom - Tom - Semitom
      // DÓ, RÉ, MI, FÁ, SOL, LÁ, SI, DÓ (uma oitava acima)
      int notas[] = {60, 62, 64, 65, 67, 69, 71, 72, 72, 71, 
        69, 67, 65, 64, 62, 60};
      
      // agora vamos percorrer as notas da escala com 1/2
      // segundo de pausa entre elas
      for(int i = 0; i < notas.length; i++){
        // vamos tocar a nota
        canalGuitarra.noteOn(notas[i], 100);
        // vamos pausar o programa por meio segundo
        Thread.currentThread().sleep(500);
        // vamos silienciar a nota
        canalGuitarra.noteOff(notas[i]);
      }
    } 
    catch (Exception e) {
      System.out.println("Houve um erro: " + e.getMessage());
    } 
  }
}



Java ::: Coleções (Collections) ::: HashSet

Java HashSet - Como usar o método add() para adicionar novos elementos a um HashSet da linguagem Java

Quantidade de visualizações: 3124 vezes
Novos elementos podem ser adicionados a um HashSet por meio do método add(), definido originalmente na interface Collection<E> e sobrescrevendo a versão herdada de AbstractCollection<E>. Este método possui a seguinte assinatura:

public boolean add(E e)
Veja que este método recebe o elemento a ser adicionado e retorna true se o elemento foi inserido com sucesso e false em caso contrário. Note que o elemento será inserido somente se este ainda não estiver contido no conjunto. Veja o seguinte trecho de código:

package estudos;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Estudos{
  public static void main(String[] args) {
    // vamos criar uma instância da classe HashSet
    Set<Integer> conjunto = new HashSet<>();
    
    // vamos tentar inserir três inteiros neste conjunto
    if(conjunto.add(5)){
      System.out.println("Elemento inserido com sucesso.");  
    }
    else{
      System.out.println("O elemento não foi inserido.");
    }
    
    if(conjunto.add(7)){
      System.out.println("Elemento inserido com sucesso.");  
    }
    else{
      System.out.println("O elemento não foi inserido.");
    }
    
    if(conjunto.add(5)){
      System.out.println("Elemento inserido com sucesso.");  
    }
    else{
      System.out.println("O elemento não foi inserido.");
    }
    
    // vamos exibir os elementos inseridos com sucesso
    Iterator iterator = conjunto.iterator();
    while(iterator.hasNext()){
      System.out.println(iterator.next());
    }
  }
}

Ao executar este código teremos o seguinte resultado:

Elemento inserido com sucesso.
Elemento inserido com sucesso.
O elemento não foi inserido.
5
7
Veja que o segundo valor 5 não foi inserido, uma vez que o mesmo já estava na coleção. Lembre-se de que objetos da classe HashSet aceitam o elemento null.


Java ::: Lista de Exercícios Resolvidos (Algorítmos Resolvidos) ::: Java Básico

Exercícios Resolvidos de Java - Java Básico - Lendo a nota de um aluno e classificando-a com as letras A, B, C, D ou E

Quantidade de visualizações: 1124 vezes
Exercício Resolvido de Java - Java Básico - Lendo a nota de um aluno e classificando-a com as letras A, B, C, D ou E

Pergunta/Tarefa:

Escreva um programa Java que lê a nota de um aluno e a classifica de acordo com as seguintes regras:

1) Maior ou igual a 9,00 - A
2) Maior ou igual a 8,0 e menor que 9,0 - B
3) Maior ou igual a 7,0 e menor que 8,0 - C
4) Maior ou igual a 6,0 e menor que 7,0 - D
5) Menor que 6,0 - E

Sua saída deverá ser parecida com:



Resposta/Solução:

Veja a resolução comentada deste exercício usando Java console:

package estudos;

import java.util.Scanner;

public class Estudos {
  public static void main(String[] args) {
    Scanner entrada = new Scanner(System.in);
    
    // vamos solicitar que o usuário informe a nota do aluno
    System.out.print("Informe a nota do aluno: ");
    double nota = Double.parseDouble(entrada.nextLine());
    char letra = 'A'; // vai guardar a letra de classificação
    
    // a nota está dentro da faixa esperada?
    if((nota < 0) || (nota > 10)){
      System.out.println("A nota esta fora da faixa esperada.");  
    }
    else{
      if(nota < 6.0){
        letra = 'E';  
      }
      else if((nota >= 6.0) && (nota < 7.0)){
        letra = 'D';  
      }
      else if((nota >= 7.0) && (nota < 8.0)){
        letra = 'C';  
      }
      else if((nota >= 8.0) && (nota < 9.0)){
        letra = 'B';  
      }
      else{
        letra = 'A';  
      }
    }
    
    // vamos mostrar a classificação
    System.out.println("A classificação desta nota é: " + letra);
    
    System.out.println("\n");
  }
}



Java ::: Lista de Exercícios Resolvidos (Algorítmos Resolvidos) ::: Java Básico

Java Básico - Exercícios Resolvidos de Java - Ex. 24 - Um programa que lê três números inteiros e mostra o maior

Quantidade de visualizações: 1039 vezes
Pergunta/Tarefa:

Faça um programa Java que solicita três números inteiros e mostra o maior deles. Exiba uma mensagem caso os três números não forem diferentes. Sua saída deverá ser parecida com:



Resposta/Solução:

Veja a resolução comentada deste exercício usando Java console:

package estudos;

import java.util.Scanner;

public class Estudos {
  public static void main(String[] args) {
    Scanner entrada = new Scanner(System.in);  
    
    // vamos solicitar os três números inteiros
    System.out.print("Informe o primeiro número: ");
    int num1 = Integer.parseInt(entrada.nextLine());
    System.out.print("Informe o segundo número: ");
    int num2 = Integer.parseInt(entrada.nextLine());
    System.out.print("Informe o terceiro número: ");
    int num3 = Integer.parseInt(entrada.nextLine());
    
    // o primeiro número é o maior?
    if((num1 > num2) && (num1 > num3)){
      System.out.println("O primeiro número é o maior");
    }
    // o segundo número é o maior?
    else if((num2 > num1) && (num2 > num3)){
      System.out.println("O segundo número é o maior");
    }
    // o terceiro número é o maior?
    else if((num3 > num1) && (num3 > num2)){
      System.out.println("O terceiro número é o maior");
    }
    // os número não são diferentes
    else{
      System.out.println("Os três números não são diferentes");
    }
    
    System.out.println("\n");
  }
}



Java ::: Lista de Exercícios Resolvidos (Algorítmos Resolvidos) ::: Arrays e Matrix (Vetores e Matrizes)

Matrizes - Exercícios e Algorítmos Resolvidos 20 - Somando os elementos da diagonal secundária de uma matriz

Quantidade de visualizações: 6526 vezes
Pergunta/Tarefa:

Em álgebra linear, a diagonal secundária de uma matriz A é a coleção das entradas Aij em que i + j é igual a n + 1 (onde n é a ordem da matriz). A diagonal secundária de uma matriz quadrada une o seu canto inferior esquerdo ao canto superior direito (conforme mostrado na saída do problema proposto abaixo).

Escreva um programa (algorítmo) Java que declara uma matriz 3x3 e pede ao usuário para informar seus valores. Em seguida mostre todos os valores da matriz e a soma dos elementos da diagonal secundária.

Sua saída deverá ser parecida com a imagem abaixo:



Resposta/Solução:

Veja a resolução comentada deste exercício usando Java console:

package exercicios;

import java.util.Scanner;

public class Exercicios {
  public static void main(String[] args) {
    // vamos fazer a leitura usando a classe Scanner
    Scanner entrada = new Scanner(System.in);
    
    // vamos declarar e construir uma matriz de três linhas e
    // três colunas
    int matriz[][] = new int[3][3];
    int soma_diagonal = 0; // guarda a soma dos elementos na
    // diagonal secundária
    
    // vamos ler os valores para os elementos da matriz
    for(int i = 0; i < matriz.length; i++){ // linhas
      for(int j = 0; j < matriz[0].length; j++){ // colunas
        System.out.print("Informe o valor para a linha " + i 
          + " e coluna " + j + ": ");
        matriz[i][j] = Integer.parseInt(entrada.nextLine());       
      }       
    }
    
    // vamos mostrar a matriz da forma que ela foi informada
    System.out.println();
    for(int i = 0; i < matriz.length; i++){ // percorre as linhas
      for(int j = 0; j < matriz[0].length; j++){ // percorre as colunas
        System.out.printf("%5d ", matriz[i][j]);
      }
      // passa para a próxima linha da matriz
      System.out.println();
    }
    
    // vamos calcular a soma dos elementos da diagonal secundária
    int ordem = 3; // ordem da matriz
    for(int i = 1; i <= matriz.length; i++){
    for(int j = 1; j <= matriz[0].length; j++){
      if((i + j) == (ordem + 1)){
        soma_diagonal = soma_diagonal + matriz[i - 1][j - 1];
      }
    }
  }
    
    // finalmente mostramos a soma da diagonal secundária
    System.out.println("\nA soma dos elementos da diagonal secundária é: " + 
     soma_diagonal);
  }
}



Java ::: Lista de Exercícios Resolvidos (Algorítmos Resolvidos) ::: Arrays e Matrix (Vetores e Matrizes)

Vetores e Matrizes - Exercícios Resolvidos de Java - Ex. 6 - Corrigindo o erro ArrayIndexOutOfBoundsException ao usar um laço for para percorrer os elementos de um vetor

Quantidade de visualizações: 11046 vezes
Pergunta/Tarefa:

Observe o seguinte trecho de código:

public static void main(String[] args){
  // um vetor de inteiros contendo cinco elementos
  int valores[] = {5, 32, 9, 10, 6};
    
  // vamos usar um laço for para exibir os valores dos elementos
  // do vetorz
  for(int i = 0; i <= 5; i++){
    System.out.println("O valor do " + (i + 1) + "º elemento é " + valores[i]);
  }
}
Quando tentamos executar este código temos um erro do tipo ArrayIndexOutOfBoundsException. Veja a saída produzida:

O valor do 1º elemento é 5
O valor do 2º elemento é 32
O valor do 3º elemento é 9
O valor do 4º elemento é 10
O valor do 5º elemento é 6
Exception in thread "main" 
   java.lang.ArrayIndexOutOfBoundsException: 5
   at javaapplication1.Main.main(Main.java:14)
Java Result: 1
Você é capaz de descobrir a causa do lançamento desta exceção? O erro no código é de sintáxe ou de lógica?

Resposta/Solução:

O erro no código é de lógica. Como temos cinco elementos no vetor
e o índice do último elemento é 4 (o índice do primeiro elemento é 0),
o valor da variável de controle do laço for não pode ultrapassar 4. No
código acima o valor da variável i vai até 5, o que provoca um erro 
ao tentar acessar um elemento do vetor que não existe.

Para corrigir o erro, basta alterar a linha:

for(int i = 0; i <= 5; i++){

para:

for(int i = 0; i < 5; i++){



Veja mais Dicas e truques de Java

Dicas e truques de outras linguagens

Quem Somos

Osmar J. Silva
WhatsApp +55 (062) 98553-6711

Goiânia-GO
Full Stack Developer, Professional Java Developer, PHP, C/C++, Python Programmer, wxWidgets Professional C++ Programmer, Freelance Programmer. Formado em Ciência da Computação pela UNIP (Universidade Paulista Campus Goiânia) e cursando Engenharia Elétrica pela PUC-Goiás. Possuo conhecimentos avançados de Java, Python, JavaScript, C, C++, PHP, C#, VB.NET, Delphi, Android, Perl, e várias tecnologias que envolvem o desenvolvimento web, desktop, front-end e back-end. Atuo há mais de 15 anos como programador freelancer, atendendo clientes no Brasil, Portugal, Argentina e vários outros paises.
Entre em contato comigo para, juntos, vermos em que posso contribuir para resolver ou agilizar o desenvolvimento de seus códigos.
José de Angelis
WhatsApp +55 (062) 98243-1195

Goiânia-GO
Formado em Sistemas de Informação pela Faculdade Delta, Pós graduado em Engenharia de Software (PUC MINAS), Pós graduado Marketing Digital (IGTI) com ênfase em Growth Hacking. Mais de 15 anos de experiência em programação Web. Marketing Digital focado em desempenho, desenvolvimento de estratégia competitiva, analise de concorrência, SEO, webvitals, e Adwords, Métricas de retorno. Especialista Google Certificado desde 2011 Possui domínio nas linguagens PHP, C#, JavaScript, MySQL e frameworks Laravel, jQuery, flutter. Atualmente aluno de mestrado em Ciência da Computação (UFG)
Não basta ter um site. É necessário ter um site que é localizado e converte usuários em clientes. Se sua página não faz isso, Fale comigo e vamos fazer uma analise e conseguir resultados mais satisfatórios..

Linguagens Mais Populares

1º lugar: Java
2º lugar: C#
3º lugar: PHP
4º lugar: Delphi
5º lugar: Python
6º lugar: JavaScript
7º lugar: C
8º lugar: C++
9º lugar: VB.NET
10º lugar: JSP (Java Server Pages)



© 2021 Arquivo de Códigos - Todos os direitos reservados | Versión en Español | Versão em Português