Использование таймера колебания для запуска события по определенному шаблону - PullRequest
1 голос
/ 10 февраля 2012

Я создаю приложение для драм-машины / секвенсора, в котором пользователь выбирает шаблон флажков (в формате сетки: каждый столбец - разный ритм, каждая строка - разный инструмент), и при нажатии «play» «Надо надеяться, что сэмпл должен воспроизводиться на каждом выбранном такте в паттерне.

В настоящее время я использую таймер java.swing для запуска метода note () в цикле. Тем не менее, это заставляет его играть на каждом "ударе", тогда как я хочу, чтобы он играл только на выбранных ударах. У меня есть ощущение, что мне нужно где-то использовать timer.stop () и timer.start (), чтобы note () не выполнялась для невыбранных ударов, а начиналась снова, когда встречается следующий выбранный удар.

Я создал массив int pattern[] = {1,0,1,0}; для хранения паттерна, в котором должен воспроизводиться звук. Я думал, что может быть способ циклически перемещаться по массиву и выполнять note () каждый раз, когда значение равно 1, но я не действительно не знаю, как это будет сделано.

Итак, я предполагаю, что главный вопрос: как получить таймер для запуска (или не запуска) события в шаблоне? Верны ли мои склонности или я неправильно к этому отношусь? Благодарен за любые предложения / советы:)

Вот что у меня есть:

import java.io.*;
import javax.sound.sampled.*;
import javax.swing.Timer;
import java.awt.event.*;

public class PlaySound extends JFrame {

static String folderPath = "folder/path/goes/here/";
public static String fileName = "kick_01.wav";
int pattern[] = {1,0,1,0};
int c = 0;

   // Constructor
   public PlaySound() {
       Timer timer = new Timer(500, new ActionListener() { //500 == 120bpm
           public void actionPerformed(ActionEvent e) {
               note(fileName); //Play audio file
       }
   });
   timer.start();
   }

   public static void note(String f) {
   try {
       try {
             // Open an audio input stream.
             File soundFile = new File(folderPath + f);
             AudioInputStream audioIn = AudioSystem.getAudioInputStream(soundFile);
             // Get a soundjava clip resource.
             Clip clip = AudioSystem.getClip();
             // Open audio clip and load samples from the audio input stream.
             clip.open(audioIn);
             clip.start();
          } catch (UnsupportedAudioFileException e) {
             e.printStackTrace();
          } catch (IOException e) {
             e.printStackTrace();
          } catch (LineUnavailableException e) {
             e.printStackTrace();
          }
   } catch (Exception e) {}
   }

}

1 Ответ

1 голос
/ 10 февраля 2012

Следите за тем, где вы находитесь в паттерне каждый раз, когда срабатывает таймер.Что-то вроде:

if (pattern[index] == 1)
    playSound();

index++;

if (index == pattern.length)
    index = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...