// Path: src/Util/GlobalConfig.java
// public class GlobalConfig
// {
// /*----------------------------------------------------------------------*/
// /* Class variables/methods */
// 
//   public static String get(String key)
//   {
//     return getConfigMap().getVal(key);
//   }
// 
//   /* lazy-load config */
//   private static String       CONFIG_LOC = "config/cmme-config.xml";
//   private static GlobalConfig configMap  = null;
//   private static GlobalConfig getConfigMap()
//   {
//     if (configMap == null)
//       configMap = new GlobalConfig(AppContext.BaseDataURL + CONFIG_LOC);
//     return configMap;
//   }
// 
// /*----------------------------------------------------------------------*/
// /* Instance variables/methods */
// 
//   private HashMap<String,String> config;
// 
//   public GlobalConfig(String configLoc)
//   {
//     config = readConfigFromFile(configLoc);
//   }
// 
//   String getVal(String key)
//   {
//     return config.get(key);
//   }
// 
//   private HashMap<String,String> readConfigFromFile(String configLoc)
//   {
//     Document               configDoc;
//     HashMap<String,String> cmap = new HashMap<String,String>();
// 
//     try
//       {
//         configDoc = XMLReader.getNonValidatingParser().build(new URL(configLoc));
//       }
//     catch (Exception e)
//       {
//         System.err.println("Exception loading config file: " + e);
//         return cmap;
//       }
// 
//     readConfigTree(configDoc.getRootElement(), cmap, "", true);
// 
//     return cmap;
//   }
// 
//   /* inserts entries with slash-separated keys into cmap, e.g., "MIDI/BPM"="80" */
//   private void readConfigTree(Element el, HashMap<String,String> cmap,
//                               String mapNS, boolean root)
//   {
//     String k = el.getName(),
//            childNS;
//     List   children = el.getChildren();
// 
//     if (!children.isEmpty())
//       {
//         childNS = root ? "" : mapNS + k + "/";
//         for (Object child : children)
//           readConfigTree((Element)child, cmap, childNS, false);
//       }
//     else
//       cmap.put(mapNS + k, el.getText());
//   }
// }


import java.io.*;
import java.util.*;
import javax.sound.midi.*;
import javax.swing.*;
import DataStruct.*;
import Util.GlobalConfig;
  public void exportMIDIFile(String fn) throws Exception
  {
    System.out.println("Wrote "+MidiSystem.write(sequenceData,1,new File(fn))+" bytes");
  }

/*------------------------------------------------------------------------
Method:  void play/stop()
Purpose: Play back or stop pre-loaded music
Parameters:
  Input:  -
  Output: -
  Return: -
------------------------------------------------------------------------*/

  int currentlyPlaying=0;

  public void play()
  {
    play(0);
  }

  public void play(int measureNum)
  {
    if (sequenceData==null)
      return;

    try
      {
        Synthesizer synthesizer;

// Path: src/Util/GlobalConfig.java
// public class GlobalConfig
// {
// /*----------------------------------------------------------------------*/
// /* Class variables/methods */
// 
//   public static String get(String key)
//   {
//     return getConfigMap().getVal(key);
//   }
// 
//   /* lazy-load config */
//   private static String       CONFIG_LOC = "config/cmme-config.xml";
//   private static GlobalConfig configMap  = null;
//   private static GlobalConfig getConfigMap()
//   {
//     if (configMap == null)
//       configMap = new GlobalConfig(AppContext.BaseDataURL + CONFIG_LOC);
//     return configMap;
//   }
// 
// /*----------------------------------------------------------------------*/
// /* Instance variables/methods */
// 
//   private HashMap<String,String> config;
// 
//   public GlobalConfig(String configLoc)
//   {
//     config = readConfigFromFile(configLoc);
//   }
// 
//   String getVal(String key)
//   {
//     return config.get(key);
//   }
// 
//   private HashMap<String,String> readConfigFromFile(String configLoc)
//   {
//     Document               configDoc;
//     HashMap<String,String> cmap = new HashMap<String,String>();
// 
//     try
//       {
//         configDoc = XMLReader.getNonValidatingParser().build(new URL(configLoc));
//       }
//     catch (Exception e)
//       {
//         System.err.println("Exception loading config file: " + e);
//         return cmap;
//       }
// 
//     readConfigTree(configDoc.getRootElement(), cmap, "", true);
// 
//     return cmap;
//   }
// 
//   /* inserts entries with slash-separated keys into cmap, e.g., "MIDI/BPM"="80" */
//   private void readConfigTree(Element el, HashMap<String,String> cmap,
//                               String mapNS, boolean root)
//   {
//     String k = el.getName(),
//            childNS;
//     List   children = el.getChildren();
// 
//     if (!children.isEmpty())
//       {
//         childNS = root ? "" : mapNS + k + "/";
//         for (Object child : children)
//           readConfigTree((Element)child, cmap, childNS, false);
//       }
//     else
//       cmap.put(mapNS + k, el.getText());
//   }
// }


// Path: src/Gfx/MIDIPlayer.java
import java.io.*;
import java.util.*;
import javax.sound.midi.*;
import javax.swing.*;
import DataStruct.*;
import Util.GlobalConfig;

  public void exportMIDIFile(String fn) throws Exception
  {
    System.out.println("Wrote "+MidiSystem.write(sequenceData,1,new File(fn))+" bytes");
  }

/*------------------------------------------------------------------------
Method:  void play/stop()
Purpose: Play back or stop pre-loaded music
Parameters:
  Input:  -
  Output: -
  Return: -
------------------------------------------------------------------------*/

  int currentlyPlaying=0;

  public void play()
  {
    play(0);
  }

  public void play(int measureNum)
  {
    if (sequenceData==null)
      return;

    try
      {
        Synthesizer synthesizer;

        sequencer=MidiSystem.getSequencer();