parent
a0f004d5f2
commit
8205f1028b
Binary file not shown.
@ -0,0 +1,282 @@ |
|||||||
|
package sig.modules; |
||||||
|
|
||||||
|
import java.awt.Color; |
||||||
|
import java.awt.Graphics; |
||||||
|
import java.awt.Image; |
||||||
|
import java.awt.Point; |
||||||
|
import java.awt.event.KeyEvent; |
||||||
|
import java.awt.geom.Rectangle2D; |
||||||
|
import java.io.File; |
||||||
|
import java.io.IOException; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import javax.imageio.ImageIO; |
||||||
|
import javax.sound.sampled.AudioInputStream; |
||||||
|
import javax.sound.sampled.AudioSystem; |
||||||
|
import javax.sound.sampled.Clip; |
||||||
|
import javax.sound.sampled.LineUnavailableException; |
||||||
|
import javax.sound.sampled.UnsupportedAudioFileException; |
||||||
|
import javax.swing.JFileChooser; |
||||||
|
import javax.swing.JOptionPane; |
||||||
|
|
||||||
|
import sig.Module; |
||||||
|
import sig.sigIRC; |
||||||
|
import sig.modules.Controller.Controller; |
||||||
|
|
||||||
|
public class DDRStepModule extends Module{ |
||||||
|
public static DDRStepModule step_module; |
||||||
|
ControllerModule controller; |
||||||
|
Controller cont; |
||||||
|
AudioInputStream songStream,metronomeStream; |
||||||
|
Clip audioClip,metronomeClick; |
||||||
|
int bpm=180; |
||||||
|
int lastsystemtime = 0; |
||||||
|
int lastnotetime = 0; |
||||||
|
int offset = 0; |
||||||
|
int framecounter = 0; |
||||||
|
Image arrow_img1,arrow_img2; |
||||||
|
byte[] lastbuttonstate = new byte[]{0,0,0,0,0,0}; |
||||||
|
boolean[] lastpressedstate = new boolean[]{false,false,false,false,false,false}; |
||||||
|
List<Note> notelist = new ArrayList<Note>(); |
||||||
|
boolean notepressed=false; |
||||||
|
int notespd = 256; |
||||||
|
|
||||||
|
public DDRStepModule(Rectangle2D bounds, String moduleName) { |
||||||
|
this(bounds,moduleName,true); |
||||||
|
} |
||||||
|
|
||||||
|
public DDRStepModule(Rectangle2D bounds, String moduleName, boolean enabled) { |
||||||
|
super(bounds, moduleName, enabled); |
||||||
|
Initialize(); |
||||||
|
} |
||||||
|
|
||||||
|
void Initialize() { |
||||||
|
DDRStepModule.step_module = this; |
||||||
|
if (sigIRC.controllermodule_enabled) { |
||||||
|
try { |
||||||
|
metronomeStream = AudioSystem.getAudioInputStream(new File(sigIRC.BASEDIR+"sigIRC/sounds/tick.wav")); |
||||||
|
try { |
||||||
|
metronomeClick = AudioSystem.getClip(); |
||||||
|
metronomeClick.open(metronomeStream); |
||||||
|
} catch (LineUnavailableException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} catch (UnsupportedAudioFileException e1) { |
||||||
|
e1.printStackTrace(); |
||||||
|
} catch (IOException e1) { |
||||||
|
e1.printStackTrace(); |
||||||
|
} |
||||||
|
controller = ControllerModule.controller_module; |
||||||
|
cont = controller.getControllers().get(0); |
||||||
|
try { |
||||||
|
arrow_img1 = ImageIO.read(new File(sigIRC.BASEDIR+"sigIRC/ddr_notes1.png")); |
||||||
|
arrow_img2 = ImageIO.read(new File(sigIRC.BASEDIR+"sigIRC/ddr_notes2.png")); |
||||||
|
} catch (IOException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} else { |
||||||
|
System.out.println("Cannot initialize DDRStepModule due to Controller Module being disabled!"); |
||||||
|
this.enabled = false; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void run() { |
||||||
|
super.run(); |
||||||
|
|
||||||
|
if (cont!=null) { |
||||||
|
//System.out.println(cont.outputButtons());
|
||||||
|
/* Start = 1 |
||||||
|
Select = 0 |
||||||
|
Up = 5 |
||||||
|
Right = 2 |
||||||
|
Left = 4 |
||||||
|
Down = 3 |
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
//System.out.println((System.currentTimeMillis()-(1000/(bpm/60d)))+"/"+lastsystemtime);
|
||||||
|
if (audioClip!=null && |
||||||
|
audioClip.isRunning() && lastsystemtime<audioClip.getFramePosition()-(44100/(bpm/60d))) { |
||||||
|
//System.out.print("Tick. ");
|
||||||
|
lastsystemtime += (44100/(bpm/60d)); |
||||||
|
//metronomeClick.loop(Clip.LOOP_CONTINUOUSLY);
|
||||||
|
metronomeClick.stop(); |
||||||
|
metronomeClick.setFramePosition(0); |
||||||
|
metronomeClick.start(); |
||||||
|
} //METRONOME CODE.
|
||||||
|
if (audioClip!=null && |
||||||
|
audioClip.isRunning() && lastnotetime<audioClip.getFramePosition()-(44100/((bpm*2)/60d))) { |
||||||
|
//System.out.print("Tick. ");
|
||||||
|
lastnotetime += (44100/((bpm*2)/60d)); |
||||||
|
for (int i=0;i<6;i++) { |
||||||
|
lastpressedstate[i]=false; |
||||||
|
} |
||||||
|
} |
||||||
|
if (audioClip!=null && audioClip.isRunning()) { |
||||||
|
framecounter++; |
||||||
|
System.out.println(audioClip.getFramePosition()); |
||||||
|
//UP
|
||||||
|
//44100Hz = 1 second
|
||||||
|
} |
||||||
|
byte[] buttons = cont.getButtons(); |
||||||
|
HandleButton(BUTTONDIR.UP,buttons); |
||||||
|
HandleButton(BUTTONDIR.DOWN,buttons); |
||||||
|
HandleButton(BUTTONDIR.LEFT,buttons); |
||||||
|
HandleButton(BUTTONDIR.RIGHT,buttons); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void HandleButton(BUTTONDIR button, byte[] buttons) { |
||||||
|
if (lastbuttonstate[button.getButton()]==0 && buttons[button.getButton()]==1) { |
||||||
|
System.out.println(button+" Pressed"/* at "+audioClip.getFramePosition()*/); |
||||||
|
lastbuttonstate[button.getButton()] = buttons[button.getButton()]; |
||||||
|
if (!lastpressedstate[button.button]) { |
||||||
|
lastpressedstate[button.button]=true; |
||||||
|
notelist.add(new Note(lastnotetime,button.getNote())); |
||||||
|
} |
||||||
|
} else |
||||||
|
if (lastbuttonstate[button.getButton()]==1 && buttons[button.getButton()]==0) { |
||||||
|
System.out.println(button+" Released"/* at "+audioClip.getFramePosition()*/); |
||||||
|
lastbuttonstate[button.getButton()] = buttons[button.getButton()]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class Note{ |
||||||
|
int framePosition; |
||||||
|
//(44100/(bpm/60d)) = Quarter Note Snapping
|
||||||
|
//(44100/((bpm*2)/60d)) = Eighth Note Snapping
|
||||||
|
NOTEPROPERTIES direction; |
||||||
|
|
||||||
|
Note(int framePosition, NOTEPROPERTIES direction) { |
||||||
|
this.framePosition = framePosition; |
||||||
|
this.direction = direction; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
enum NOTEPROPERTIES{ |
||||||
|
UP(0,2), |
||||||
|
DOWN(-64,1), |
||||||
|
LEFT(-128,0), |
||||||
|
RIGHT(64,3); |
||||||
|
|
||||||
|
int xoffset,subimage; |
||||||
|
|
||||||
|
NOTEPROPERTIES(int xoffset,int subimage) { |
||||||
|
this.xoffset = xoffset; |
||||||
|
this.subimage = subimage; |
||||||
|
} |
||||||
|
|
||||||
|
int getXOffset() { |
||||||
|
return xoffset; |
||||||
|
} |
||||||
|
|
||||||
|
int getSubimage() { |
||||||
|
return subimage; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
enum BUTTONDIR{ |
||||||
|
UP(5,NOTEPROPERTIES.UP), |
||||||
|
DOWN(3,NOTEPROPERTIES.DOWN), |
||||||
|
LEFT(4,NOTEPROPERTIES.LEFT), |
||||||
|
RIGHT(2,NOTEPROPERTIES.RIGHT); |
||||||
|
|
||||||
|
int button; |
||||||
|
NOTEPROPERTIES note; |
||||||
|
|
||||||
|
BUTTONDIR(int button, NOTEPROPERTIES note) { |
||||||
|
this.button = button; |
||||||
|
this.note = note; |
||||||
|
} |
||||||
|
|
||||||
|
int getButton() { |
||||||
|
return button; |
||||||
|
} |
||||||
|
NOTEPROPERTIES getNote() { |
||||||
|
return note; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void draw(Graphics g) { |
||||||
|
super.draw(g); |
||||||
|
Point initialP = new Point((int)this.position.getCenterX()-arrow_img1.getWidth(sigIRC.window)/2,(int)this.position.getY()+(int)this.position.getHeight()); |
||||||
|
g.drawImage(arrow_img1, (int)this.position.getCenterX()-arrow_img1.getWidth(sigIRC.window)/2, (int)this.position.getY()+(int)this.position.getHeight(), sigIRC.window); |
||||||
|
|
||||||
|
if (audioClip!=null && audioClip.isRunning()) { |
||||||
|
for (int i=notelist.size()-1;i>0;i--) { |
||||||
|
Note n = notelist.get(i); |
||||||
|
if ((int)(notespd*((audioClip.getFramePosition()-n.framePosition)/44100d))>this.position.getHeight()) { |
||||||
|
break; |
||||||
|
} |
||||||
|
g.setColor(Color.RED); |
||||||
|
g.drawImage(arrow_img2, initialP.x+128+n.direction.xoffset, initialP.y-(int)(notespd*((audioClip.getFramePosition()-n.framePosition)/44100d)), initialP.x+64+128+n.direction.xoffset, initialP.y+64-(int)(notespd*((audioClip.getFramePosition()-n.framePosition)/44100d)), n.direction.subimage*64, 0, n.direction.subimage*64+64, 64, new Color(0,0,0,0), sigIRC.window); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void keypressed(KeyEvent ev) { |
||||||
|
super.keypressed(ev); |
||||||
|
if (ev.getKeyCode() == ev.VK_OPEN_BRACKET) { |
||||||
|
JFileChooser song_choice = new JFileChooser(); |
||||||
|
int val = song_choice.showOpenDialog(sigIRC.window); |
||||||
|
if (val == JFileChooser.APPROVE_OPTION) { |
||||||
|
System.out.println("Opening file "+song_choice.getSelectedFile().getAbsolutePath()); |
||||||
|
} |
||||||
|
JOptionPane bpm_pane = new JOptionPane(); |
||||||
|
String input = bpm_pane.showInputDialog(sigIRC.window,"Input Song BPM:","180"); |
||||||
|
if (input!=null && input.length()>0) { |
||||||
|
bpm = Integer.parseInt(input); |
||||||
|
System.out.println("BPM set to "+bpm); |
||||||
|
try { |
||||||
|
songStream = AudioSystem.getAudioInputStream(new File(song_choice.getSelectedFile().getAbsolutePath())); |
||||||
|
try { |
||||||
|
if (audioClip!=null && audioClip.isOpen()) { |
||||||
|
audioClip.close(); |
||||||
|
} |
||||||
|
audioClip = AudioSystem.getClip(); |
||||||
|
audioClip.open(songStream); |
||||||
|
} catch (LineUnavailableException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} catch (UnsupportedAudioFileException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (IOException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
} |
||||||
|
bpm_pane.showMessageDialog(sigIRC.window,"Press the RIGHT BRACKET button to begin playing."); |
||||||
|
} else |
||||||
|
if (ev.getKeyCode() == ev.VK_1) { |
||||||
|
if (audioClip.isOpen() && !audioClip.isRunning()) { |
||||||
|
audioClip.start(); |
||||||
|
framecounter = audioClip.getFramePosition(); |
||||||
|
System.out.println("Audio Clip Started."); |
||||||
|
lastsystemtime = audioClip.getFramePosition(); |
||||||
|
lastnotetime = audioClip.getFramePosition(); |
||||||
|
} |
||||||
|
} else |
||||||
|
if (ev.getKeyCode() == ev.VK_2) { |
||||||
|
if (audioClip.isOpen() && audioClip.isRunning()) { |
||||||
|
audioClip.stop(); |
||||||
|
audioClip.setFramePosition(offset); |
||||||
|
System.out.println("Audio Clip Stopped."); |
||||||
|
} |
||||||
|
} else |
||||||
|
if (ev.getKeyCode() == ev.VK_3) { |
||||||
|
if (audioClip.isOpen() && audioClip.isRunning()) { |
||||||
|
offset = audioClip.getFramePosition(); |
||||||
|
//audioClip.setMicrosecondPosition(offset);
|
||||||
|
System.out.println("Set new Offset to "+offset); |
||||||
|
} |
||||||
|
} else |
||||||
|
if (ev.getKeyCode() == ev.VK_4) { |
||||||
|
if (audioClip.isOpen() && !audioClip.isRunning()) { |
||||||
|
framecounter = 0; |
||||||
|
audioClip.setFramePosition(0); |
||||||
|
System.out.println("Reset offset to 0."); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue