package coen; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.FileWriter; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.FileChannel; import java.nio.file.*; import java.util.ArrayList; import java.util.Arrays; import javax.sound.*; import javax.sound.sampled.*; import javax.swing.JOptionPane; import coen.Model.PlaybackWorker; import sun.audio.AudioPlayer; public class MPCC { // The array of button configurations private ArrayList<ButtonC> buttons; private ArrayList<String> sampleNames; private ArrayList<short[]> sampleArrays; private String configFn = "config"; public char tempo; public char FX1mode; public char FX2mode; private static String[] audioFileNames = {"12.dat", "13.dat", "14.dat", "15.dat", "08.dat", "09.dat", "10.dat", "11.dat", "04.dat", "05.dat", "06.dat", "07.dat", "00.dat", "01.dat", "02.dat", "03.dat"}; private static ArrayList<String> buttonOrder = new ArrayList<String>(Arrays.asList("13", "14", "15", "16", "9", "10", "11", "12", "5", "6", "7", "8", "1", "2", "3", "4")); public MPCC () { // Initialize the buttons this.buttons = new ArrayList<ButtonC>(); for (int i = 0; i < 16; i++) { this.buttons.add(new ButtonC(buttonOrder.get(i), audioFileNames[i])); } // Initialize the list for imported samples this.sampleArrays = new ArrayList<short[]>(); this.sampleNames = new ArrayList<String>(); // Initialize the MPC variables tempo = 0x80; FX1mode = 1; FX2mode = 2; } public ArrayList<ButtonC> getButtons() { return buttons; } public void AddSample(short[] arr, String fn) { if (!sampleNames.contains(fn)) { sampleNames.add(fn); //sampleArrays.add(arr); sampleArrays.add(AudioP.scaleVolume(arr)); System.out.println("Got Sample. len = " + String.valueOf(sampleNames.size())); } } public int getNumberSamples() { return sampleNames.size(); } public String[] getSampleStrings() { return (String[]) sampleNames.toArray(new String[sampleNames.size()]); } public static int getMatchingButtonNumber(String btnString) { return buttonOrder.indexOf(btnString); } public short[] getSample(int sampleNumber) { return sampleArrays.get(sampleNumber); } public static String getMatchingButtonString(int btnNum) { return buttonOrder.get(btnNum); } public void ExportConfig(String path) { // Export each of the files, as well as the config file try { File dir = new File(path); dir.mkdirs(); File outputFile = new File(dir, this.configFn); byte[] configBytes = new byte[35]; configBytes[0] = (byte) FX1mode; configBytes[1] = (byte) FX2mode; configBytes[2] = (byte) tempo; int configCount = 3; for (int i = 0; i < 16; i++) { // This will need changing cause buttons aren't in linear order configBytes[configCount] = (byte) this.buttons.get(Integer.valueOf(buttonOrder.get(i))-1).GetLatching(); configCount++; configBytes[configCount] = (byte) this.buttons.get(Integer.valueOf(buttonOrder.get(i))-1).GetLoopInterval(); configCount++; this.buttons.get(i).OutputToFile(path); } FileChannel out = new FileOutputStream(outputFile).getChannel(); out.write(ByteBuffer.wrap(configBytes)); out.close(); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Alert message", "Title", JOptionPane.WARNING_MESSAGE); } } public void ImportConfig(String path) { System.out.println("Got path " + path + "\\" + this.configFn); // Read each of the files in, overwrite any current data Path pt = Paths.get(path + "\\" + this.configFn); byte[] configData; try { configData = Files.readAllBytes(pt); } catch (Exception e) { JOptionPane.showMessageDialog(null, "Could not open existing config", "Error", JOptionPane.WARNING_MESSAGE); e.printStackTrace(); return; } // Got the config this.FX1mode = (char) configData[0]; this.FX2mode = (char) configData[1]; this.tempo = (char)(((int)configData[2]+256)%256); System.out.println((int)this.FX1mode + " " + (int)this.FX2mode + " " + (int)this.tempo + " " + (int)configData[2]); for (int i = 0; i < 16; i++) { // Load latchHold ButtonC btn = buttons.get(Integer.valueOf(buttonOrder.get(i))-1); btn.SetLatching((char)configData[3+i*2]); btn.SetLoopInterval((char)configData[4+i*2]); // Load the sample, if it's there byte[] sampleData; Path samplePath = Paths.get(path + "\\" + audioFileNames[Integer.valueOf(buttonOrder.get(i))-1]); try { sampleData = Files.readAllBytes(samplePath); System.out.println(sampleData.length); if (sampleData.length > 1) { short[] sample = new short[sampleData.length/2]; ByteBuffer.wrap(sampleData).order(ByteOrder.BIG_ENDIAN).asShortBuffer().get(sample); for (int j = 0; j < sample.length; j++) { if (sample[j] <= 0) { sample[j] = (short) (sample[j]-32768); } else { sample[j] = (short) (sample[j]+32768); } //sample[j] = (short)(((int)sample[j]+32768)%32768); } btn.SetSample(sample); } else { short[] dummyShort = new short[1]; dummyShort[0] = 0; btn.SetSample(dummyShort); } } catch (Exception e) { JOptionPane.showMessageDialog(null, "Could not open track " + buttonOrder.get(i) + ", loaded blank", "Error", JOptionPane.WARNING_MESSAGE); short[] dummyShort = new short[1]; dummyShort[0] = 0; btn.SetSample(dummyShort); e.printStackTrace(); } } } }