]> ruin.nu Git - moosique.git/blobdiff - MooKeyboard.java
no message
[moosique.git] / MooKeyboard.java
index 90ed18fd4acf3d582b7569f08f16c23b25fc4ebc..5581172e6d10792cbe5d6cbbae30c10b88ce492e 100644 (file)
@@ -9,22 +9,36 @@ import java.awt.event.*;
  
 public class MooKeyboard extends KeyAdapter {
 
-       private boolean[] isOn = new boolean[120];
-       private static int startNote = 48;
-       private static final int[] keyToNote = new int[120];
+       private boolean[] isOn;
+       private static int startNote;
+       private static int[] keyToNote = new int[120];
 
+       /**
+        * Sets up the synthesizer emulation.
+        */
+       public MooKeyboard() {
+               isOn = new boolean[120];
+       }
+
+       static {
+               startNote = 48;
+               makeKeyboardMapping();
+       }
+       
        /**
         * Plays the appropriate MIDI NoteOn event.
         */
        public void keyPressed(KeyEvent e) {
-               try {
-                       // Retrieves the notenumber from the conversion array.
-                       int noteNumber = keyToNote[e.getKeyCode()];
-                       // If note is not already on and the key is mapped to a note, sends the NoteOn event.
-                       if (!isOn[noteNumber] && noteNumber > 0) Moosique.getActiveChannel().noteOn(noteNumber, 127);
-                       isOn[noteNumber] = true;
-               } catch (ArrayIndexOutOfBoundsException x) {
-                       return;
+               if (!e.isControlDown()) {
+                       try {
+                               // Retrieves the notenumber from the conversion array.
+                               int noteNumber = keyToNote[e.getKeyCode()];
+                               // If note is not already on and the key is mapped to a note, sends the NoteOn event.
+                               if (!isOn[noteNumber] && noteNumber > 0) Moosique.getActiveChannel().noteOn(noteNumber, 127);
+                               isOn[noteNumber] = true;
+                       } catch (ArrayIndexOutOfBoundsException x) {
+                               return;
+                       }
                }
        }
        
@@ -32,14 +46,16 @@ public class MooKeyboard extends KeyAdapter {
         * Plays the appropriate MIDI NoteOff event.
         */
        public void keyReleased(KeyEvent e) {
-               try {
-                       // Retrieves the notenumber from the conversion array.
-                       int noteNumber = keyToNote[e.getKeyCode()];
-                       // Sends the NoteOff event.
-                       Moosique.getActiveChannel().noteOff(noteNumber);
-                       isOn[noteNumber] = false;
-               } catch (ArrayIndexOutOfBoundsException x) {
-                       return;
+               if (!e.isControlDown()) {
+                       try {
+                               // Retrieves the notenumber from the conversion array.
+                               int noteNumber = keyToNote[e.getKeyCode()];
+                               // Sends the NoteOff event.
+                               Moosique.getActiveChannel().noteOff(noteNumber);
+                               isOn[noteNumber] = false;
+                       } catch (ArrayIndexOutOfBoundsException x) {
+                               return;
+                       }
                }
        }
 
@@ -47,8 +63,10 @@ public class MooKeyboard extends KeyAdapter {
         * Sets the octave of the lower part of the keyboard (default = 4)
         * @param n     the octave to start at
         */
-       public void setOctave(int n) {
-               startNote = n * 12;
+       public static void setOctave(int n) {
+               if ((startNote == 0 && n == -1) || (startNote == 108 && n == 1)) return;
+               startNote += n*12;
+               makeKeyboardMapping();
        }
 
        /** Maps keycodes (array indices) to MIDI note numbers using the following layout:
@@ -58,7 +76,7 @@ public class MooKeyboard extends KeyAdapter {
         *  s d   g h j   l     =>  # #   # # #   #
         * z x c v b n m , .    => c d e f g a b c d
         */
-       static {
+       private static void makeKeyboardMapping() {
                keyToNote[KeyEvent.VK_Q] = startNote;
                keyToNote[83] = startNote + 1;
                keyToNote[88] = startNote + 2;
@@ -92,4 +110,4 @@ public class MooKeyboard extends KeyAdapter {
                keyToNote[48] = startNote + 27;
                keyToNote[80] = startNote + 28;
        }
-}
\ No newline at end of file
+}