2012-02-10 2 views
1

사용자가 체크 박스 패턴을 선택하는 드럼 머신/시퀀서 애플리케이션을 구축하고 있습니다 (각 열은 각각 다른 비트이고 각 행이 다른 악기 임), "재생"을 클릭하면 오디오 샘플이 패턴의 선택된 비트마다 재생됩니다.스윙 타이머를 사용하여 특정 패턴의 이벤트 트리거

현재 루프에서 note() 메소드를 실행하기 위해 java.swing 타이머를 사용하고 있습니다. 그러나, 이것은 모든 "비트"에서 연주하는 반면, 나는 단지 선택된 비트에서 연주하기를 원합니다. timer.stop() 및 timer.start()를 어딘가에 사용해야한다는 느낌이 들기 때문에 note()는 선택되지 않은 비트에서 실행되지 않지만 다음 선택된 비트를 만날 때 다시 시작됩니다.

나는 사운드를 재생할 패턴을 보유하기 위해 배열 int pattern[] = {1,0,1,0};을 만들었습니다. 배열을 순환하고 값이 1이 될 때마다 note()를 실행할 수있는 방법이있을 것이라고 생각했지만, 어떻게 될지 정말로 알지 못합니다.

그래서 나는 주된 질문은 : 타이머를 트리거 (또는 트리거하지 않음) 패턴으로 어떻게 얻는가? 내 성향이 정확합니까? 아니면 잘못된 방식으로 접근합니까? 어떤 제안/조언을 감사 :

는 여기에 지금까지이 작업은 다음과 같습니다

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) {} 
    } 

} 
+0

타이머를 일정 속도로 발동하는 대신 다른 논리를 사용하여 메모를 재생할지 여부를 결정하는 것이 좋습니다. BTW - 당신은 Swing의 Timer가 부정확하다는 것을 알 수 있습니까? –

답변

1

것은 당신이 패턴으로 타이머 화재 때마다 어디를 추적합니다. 다음과 같이하십시오 :

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

index++; 

if (index == pattern.length) 
    index = 0; 
+0

와우. 이전에 그런 식으로 작업을 시도했지만 올바르게 형식화하지 않아야합니다./ 감사합니다. D – MisterM2402