// Path: src/ym2151/Utils.java
// public class Utils {
// 	
// 	/**
// 	 * Get the extension of a file.
// 	 */  
// 	public static String getExtension(File f) {
// 	    String ext = null;
// 	    String s = f.getName();
// 	    int i = s.lastIndexOf('.');
// 
// 	    if (i > 0 &&  i < s.length() - 1) {
// 	        ext = s.substring(i+1).toLowerCase();
// 	    }
// 	    if(ext == null) {
// 	    	return "";
// 	    }
// 	    return ext;
// 	}
// 	
// 	/**
// 	 * Adds all Elements from an Array to a DefaultListModel
// 	 * @param m the Model to add the Entries to
// 	 * @param o the Entries to add
// 	 * */
// 	public static <B> void addAll(DefaultListModel<B> m, B[] o){
// 		for(int i = 0 ; i < o.length; i++){
// 			m.addElement(o[i]);
// 		}		
// 	}
// 	
// 	/**
// 	 * Adds all Elements from a List to a DefaultListModel
// 	 * @param m the Model to add the Entries to
// 	 * @param o the Entries to add
// 	 * */
// 	public static <B> void addAll(DefaultListModel<B> m, List<B> o){
// 		for(int i = 0 ; i < o.size(); i++){
// 			m.addElement(o.get(i));
// 		}	
// 	}
// 	
// 	/**
// 	 * Removes all entries of the List from a DefaultListModel
// 	 * @param m the Model to remove the Entries from
// 	 * @param o the Entries to remove
// 	 * */
// 	public static <B> void removeAll(DefaultListModel<B> m, List<B> o){
// 		for(int i = 0 ; i < o.size(); i++){
// 			m.removeElement(o.get(i));
// 		}		
// 	}
// 	
// 	/**
// 	 * Fills a centered circle
// 	 * @param g the Graphics Context to draw to
// 	 * @param x the x-coordinate 
// 	 * @param y the y-coordinate
// 	 * @param r the Radius
// 	 * */
// 	public static void fillCenteredCircle(Graphics2D g, int x, int y, int r) {
// 		  x = x-(r/2);
// 		  y = y-(r/2);
// 		  g.fillOval(x,y,r,r);
// 	}
// 
// 	/**
// 	 * Draws a centered circle
// 	 * @param g the Graphics Context to draw to
// 	 * @param x the x-coordinate 
// 	 * @param y the y-coordinate
// 	 * @param r the Radius
// 	 * */
// 	public static void drawCenteredCircle(Graphics2D g, int x, int y, int r) {
// 		  x = x-(r/2);
// 		  y = y-(r/2);
// 		  g.drawOval(x,y,r,r);
// 	}
// 	
// 	
// 	/**
// 	 * creates a DefaultListModel from an Array
// 	 * */
// 	public static<T>  DefaultListModel<T> getListModel(T[] data){
// 		DefaultListModel<T> lm = new DefaultListModel<T>();
// 		for(T t : data){
// 			lm.addElement(t);
// 		}
// 		return lm;
// 	}	
// }


import ym2151.Utils;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
import java.util.LinkedList;
import javax.swing.JPanel;
	
	/**
	 * Removes all Listeners from this Knob
	 * */
	public void removeAllKnobListener(){
		listeners = new LinkedList<KnobListener>();
	}
	
	/**
	 * Sends a Event to all the Listeners
	 * */
	private void dispatchEvent(){
		for(KnobListener l : listeners){
			l.knobTurned(var);
		}
	}
	
	@Override
	public void paintComponent (Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;
		
		//get the Middle of the Panel
		int middle = Math.min(getWidth(), getHeight())/2;
		
		if(getWidth()<getHeight()){ //width
			g2d.rotate(Math.toRadians(((maxRotation)*(1/(max-min)))*var) - Math.toRadians(90), middle, getHeight()/2); //max roatation
			
			//draw filled part of the knob
			g2d.setColor(Color.DARK_GRAY);
// Path: src/ym2151/Utils.java
// public class Utils {
// 	
// 	/**
// 	 * Get the extension of a file.
// 	 */  
// 	public static String getExtension(File f) {
// 	    String ext = null;
// 	    String s = f.getName();
// 	    int i = s.lastIndexOf('.');
// 
// 	    if (i > 0 &&  i < s.length() - 1) {
// 	        ext = s.substring(i+1).toLowerCase();
// 	    }
// 	    if(ext == null) {
// 	    	return "";
// 	    }
// 	    return ext;
// 	}
// 	
// 	/**
// 	 * Adds all Elements from an Array to a DefaultListModel
// 	 * @param m the Model to add the Entries to
// 	 * @param o the Entries to add
// 	 * */
// 	public static <B> void addAll(DefaultListModel<B> m, B[] o){
// 		for(int i = 0 ; i < o.length; i++){
// 			m.addElement(o[i]);
// 		}		
// 	}
// 	
// 	/**
// 	 * Adds all Elements from a List to a DefaultListModel
// 	 * @param m the Model to add the Entries to
// 	 * @param o the Entries to add
// 	 * */
// 	public static <B> void addAll(DefaultListModel<B> m, List<B> o){
// 		for(int i = 0 ; i < o.size(); i++){
// 			m.addElement(o.get(i));
// 		}	
// 	}
// 	
// 	/**
// 	 * Removes all entries of the List from a DefaultListModel
// 	 * @param m the Model to remove the Entries from
// 	 * @param o the Entries to remove
// 	 * */
// 	public static <B> void removeAll(DefaultListModel<B> m, List<B> o){
// 		for(int i = 0 ; i < o.size(); i++){
// 			m.removeElement(o.get(i));
// 		}		
// 	}
// 	
// 	/**
// 	 * Fills a centered circle
// 	 * @param g the Graphics Context to draw to
// 	 * @param x the x-coordinate 
// 	 * @param y the y-coordinate
// 	 * @param r the Radius
// 	 * */
// 	public static void fillCenteredCircle(Graphics2D g, int x, int y, int r) {
// 		  x = x-(r/2);
// 		  y = y-(r/2);
// 		  g.fillOval(x,y,r,r);
// 	}
// 
// 	/**
// 	 * Draws a centered circle
// 	 * @param g the Graphics Context to draw to
// 	 * @param x the x-coordinate 
// 	 * @param y the y-coordinate
// 	 * @param r the Radius
// 	 * */
// 	public static void drawCenteredCircle(Graphics2D g, int x, int y, int r) {
// 		  x = x-(r/2);
// 		  y = y-(r/2);
// 		  g.drawOval(x,y,r,r);
// 	}
// 	
// 	
// 	/**
// 	 * creates a DefaultListModel from an Array
// 	 * */
// 	public static<T>  DefaultListModel<T> getListModel(T[] data){
// 		DefaultListModel<T> lm = new DefaultListModel<T>();
// 		for(T t : data){
// 			lm.addElement(t);
// 		}
// 		return lm;
// 	}	
// }


// Path: src/ym2151/Swing/Knob.java
import ym2151.Utils;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.AffineTransform;
import java.util.LinkedList;
import javax.swing.JPanel;

	
	/**
	 * Removes all Listeners from this Knob
	 * */
	public void removeAllKnobListener(){
		listeners = new LinkedList<KnobListener>();
	}
	
	/**
	 * Sends a Event to all the Listeners
	 * */
	private void dispatchEvent(){
		for(KnobListener l : listeners){
			l.knobTurned(var);
		}
	}
	
	@Override
	public void paintComponent (Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;
		
		//get the Middle of the Panel
		int middle = Math.min(getWidth(), getHeight())/2;
		
		if(getWidth()<getHeight()){ //width
			g2d.rotate(Math.toRadians(((maxRotation)*(1/(max-min)))*var) - Math.toRadians(90), middle, getHeight()/2); //max roatation
			
			//draw filled part of the knob
			g2d.setColor(Color.DARK_GRAY);
			Utils.fillCenteredCircle(g2d,middle,getHeight()/2,middle*2);