3
respostas

O que fazer agora?

Olá! Comecei o curso de Java há pouco tempo, e também há pouco tempo comecei a ter contato com o Java. Eu tenho uma certa experiência em C++, principalmente para console MSDOS. Cheguei a fazer até programas gráficos usando a BGI do MSDOS. Mas, só agora estou tendo meus primeiros contatos com o Java. Em partes, a estrutura do código parece bem semelhante ao C++ e ao código fonte para IDE do Arduino (.ino). Enfim, comecei o curso de java e, paralelo ao curso, comecei a pesquisar coisas do meu interesse na internet, em busca de referências, exemplos, etc. Eu tenho vontade de trabalhar com gráficos e com DSP para áudio em Java. Embora isso ainda seja avançado para o meu nível de conhecimento em Java, vendo referências na internet e fazendo testes e tentativas, eu consegui fazer algumas coisas bem interessantes, mas não consigo sair do lugar.

Explicando melhor:

Gráfico e interface de usuário: Eu descobri como criar uma janela gráfica (JFrame) e nessa janela, colocar uma tela de fundo (JPanel), e nessa tela, inserir texto e botões. Mas ainda não consegui descobrir algumas coisas:

  1. Eu consigo mudar a cor do texto e do fundo do texto, mas não consigo posicioná-lo no JPanel e nem mudar o tamanho.
  2. Eu consigo inserir texto nos botões, consigo escolher a cor do texto e a cor do fundo, mas ainda não descobri como posicionar os botões, e também não descobri como colocar uma ação nesse botão, (algo como um método (void) que seja executado quando o usuário clica no botão).

Áudio: Usando as classes do package javax.sound.sampled. , eu consegui criar objetos de entrada/saída de áudio virtuais, cada um ligado á uma entrada/saída física do hardware. Mas não consigo usá-las. Ainda não descobri como ler amostragens (samples) da entrada e nem como mandar samples para a saída. O que eu tentei fazer inicialmente era um streaming. Ler uma entrada stereo e mandar as samples em tempo real para uma saída stereo. Mas ainda sem sucesso. Não me lembro exatamente o que era, (provavelmente uma classe que cria um objeto), chamado AudioFormat, que usa 5 parâmetros para streaming de áudio: número de canais, (eu geralmente uso stereo (2)); número de bits por sample (geralmente uso 16 ou 24); número de samples por segundo (geralmente uso 44100, 48000 ou 96000); e dois booleans que eu não me lembro agora a que se referem. Mesmo assim, ainda não consegui associar esse objeto AudioFormat aos objetos de entrada/saída virtuais.

Vocês podem me dar dicas, tanto na interface de usuário quanto na parte do áudio?

OBS: Não consegui inserir o código fonte nesse texto (ficou muito grande), então vou tentar colocá-lo como uma resposta a este tópico.

Obrigado!

3 respostas

Aqui está o código.

import javax.sound.sampled.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;

public class AudioDeviceSelect 
{
    public static Mixer.Info[] deviceInfo = AudioSystem.getMixerInfo();
    public static Mixer tvSpeakers = AudioSystem.getMixer(deviceInfo[0]);
    public static Mixer Scarlett2i2Output = AudioSystem.getMixer(deviceInfo[1]);
    public static Mixer BuiltInLineOut = AudioSystem.getMixer(deviceInfo[2]);
    public static Mixer BuiltInDigitalOut = AudioSystem.getMixer(deviceInfo[3]);
    public static Mixer webcamMic = AudioSystem.getMixer(deviceInfo[4]);
    public static Mixer BuiltInLineIn = AudioSystem.getMixer(deviceInfo[5]);
    public static Mixer Scarlett2i2Input = AudioSystem.getMixer(deviceInfo[6]);
    public static Mixer BuiltInMicIn = AudioSystem.getMixer(deviceInfo[7]);
    public static JFrame mainWindow = new JFrame();
    public static JPanel mainScreen = new JPanel();
    public static Label mainScreenText0 = new Label();
    public static Label mainScreenText1 = new Label();
    public static Button inputChoice0 = new Button();
    public static Button inputChoice1 = new Button();
    public static Button inputChoice2 = new Button();
    public static Button inputChoice3 = new Button();
    public static Button outputChoice0 = new Button();
    public static Button outputChoice1 = new Button();
    public static Button outputChoice2 = new Button();
    public static Button outputChoice3 = new Button();
    public static byte n, chosenOutputMixer, chosenInputMixer;

    public static void mainScreenSetup()
    {
        mainScreen.setVisible(true);
        mainScreen.setLocation(0, 0);
        mainScreen.setSize(1280, 720); //Usual 720p Resolution
        mainScreen.setBackground(Color.gray);

        mainScreenText0.setForeground(Color.black);
        mainScreenText0.setFont(Font.decode(Font.DIALOG));
        mainScreenText0.setText("Choose Audio Input:");
        mainScreenText0.setVisible(true);

        mainScreenText1.setForeground(Color.black);
        mainScreenText1.setFont(Font.decode(Font.DIALOG));
        mainScreenText1.setText("Choose Audio Output:");
        mainScreenText1.setVisible(true);

        inputChoice0.setBackground(Color.white);
        inputChoice0.setForeground(Color.black);
        inputChoice0.setLabel("USB WebCam Mic");
        inputChoice0.setVisible(true);

        inputChoice1.setBackground(Color.white);
        inputChoice1.setForeground(Color.black);
        inputChoice1.setLabel("Built-in Stereo Line Input");
        inputChoice1.setVisible(true);

        inputChoice2.setBackground(Color.white);
        inputChoice2.setForeground(Color.black);
        inputChoice2.setLabel("FS2i2 Stereo Input");
        inputChoice2.setVisible(true);

        inputChoice3.setBackground(Color.white);
        inputChoice3.setForeground(Color.black);
        inputChoice3.setLabel("Built-in Mono Mic Input");
        inputChoice3.setVisible(true);

        outputChoice0.setBackground(Color.white);
        outputChoice0.setForeground(Color.black);
        outputChoice0.setLabel("TV Speakers");
        outputChoice0.setVisible(true);

        outputChoice1.setBackground(Color.white);
        outputChoice1.setForeground(Color.black);
        outputChoice1.setLabel("FS2i2 Stereo Output");
        outputChoice1.setVisible(true);

        outputChoice2.setBackground(Color.white);
        outputChoice2.setForeground(Color.black);
        outputChoice2.setLabel("Built-in Stereo Line Output");
        outputChoice2.setVisible(true);

        outputChoice3.setBackground(Color.white);
        outputChoice3.setForeground(Color.black);
        outputChoice3.setLabel("Built-in Stereo Digital Output");
        outputChoice3.setVisible(true);

        mainScreen.add(mainScreenText0);
        mainScreen.add(inputChoice0);
        mainScreen.add(inputChoice1);
        mainScreen.add(inputChoice2);
        mainScreen.add(inputChoice3);
        mainScreen.add(mainScreenText1);
        mainScreen.add(outputChoice0);
        mainScreen.add(outputChoice1);
        mainScreen.add(outputChoice2);
        mainScreen.add(outputChoice3);
    }
    public static void audioDeviceList()
    {
        System.out.print("Audio Device List:\n\n");
        for(n = 0; n < deviceInfo.length; n += 1)
        {
            System.out.print("Audio Device Number: ");
            System.out.print(n);
            System.out.print("\nAudio Device Info: ");
            System.out.print(deviceInfo[n]);
            System.out.print("\n\n");
        }
        /*
         * Results:
         * 0 = TV Speakers (NVIDIA HDMI Output)
         * 1 = Focusrite Scarlett 2i2 Stereo Output
         * 2 = Motherboard Built-In Stereo Line Output
         * 3 = Motherboard Built-In Digital Stereo Output
         * 4 = USB Webcam Microphone
         * 5 = Motherboard Built-In Stereo Line Input
         * 6 = Focusrite Scarlett 2i2 Stereo Input
         * 7 = Motherboard Built-In Mono Microphone Input
         */
    }
    public static void main(String[] args)
    {
        audioDeviceList();
        mainWindow.setVisible(true);
        mainWindow.setSize(1280, 720);
        mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainScreenSetup();
        mainWindow.add(mainScreen);
    }
}

Olá Rafael, tudo bem?

Desculpa a demora em te dar um retorno,

Nós analisamos o caminho que você escolheu para seu aprendizado do Java, e ficamos impressionados com o uso da linguagem que você está fazendo, parabéns!

Infelizmente não temos conteúdos específicos que te ajudem no desenvolvimento de uma aplicação Java Desktop para trabalhar com áudio.

O Java é uma linguagem poderosa e robusta, e realmente é possível fazer uma aplicação como essa que você idealizou. Porém essa não é uma utilização comum para o Java. Você deve ter reparado que temos bastante conteúdo do Java voltado para o desenvolvimento de aplicações para Web e desenvolvimento Mobile... Isso ocorre pois esses são os dois ambientes no qual o Java vem sendo mais utilizado, e consequentemente passou a existir um desenvolvimento maior da linguagem nessas áreas, com mais tecnologias envolvendo o Java, dando uma maior profundidade em seu uso nessas aplicações.

O que posso te recomendar para te auxiliar no desenvolvimento dessa aplicação, é aprofundar seu conhecimento das bibliotecas da linguagem.

Recomendo o livro da Casa do Código: Explorando APIs e bibliotecas Java , onde você poderá ter um contato maior com outras bibliotecas que podem ser úteis, e também terá um contato breve com Java FX.

Além disso recomendo estudar Swing e principalmente JavaFX a fundo, pois vão te possibilitar usar a linguagem para esse propósito.

Espero ter te ajudado nesse caminho!

Obrigado!