public void ParseLevel(string filename)
    {
        // open level file
        if (System.IO.File.Exists(filename))
        {
            Dictionary<string, object> json = (Dictionary<string, object>)MiniJSON.Json.Deserialize(File.ReadAllText(filename));
            levelName	= (string)json["name"];
            musicFolder = (string)json["music"];

            List<object> waves = (List<object>)json["waves"];
            foreach (Dictionary<string, object> wave in waves)
            {
                WaveDefinition waveDefn = new WaveDefinition((long)wave["id"], (string)wave["track"]);

                foreach (Dictionary<string, object> enemy in (List<object>)wave["enemies"])
                {
                    Vector3 vec = new Vector3();
                    List<object> arr = (List<object>)enemy["spawnPos"];
                    for (int i = 0; i < arr.Count; i++)
                    {
                        vec[i] = (float)((double)arr[i]);
                    }

                    waveDefn.AddEnemy((long)enemy["id"], vec, (float)((double)enemy["delay"]));
                }
                waveDefns.Add(waveDefn);
            }

            List<object> level = (List<object>)json["level"];
            foreach (List<object> wave in level)
            {
                levelDefn.AddPair((long)wave[0], (float)((double)wave[1]));
            }
        }
        else
        {
            Debug.LogError("Could not open level " + filename);
        }
        GameObject.Find("MixerObject").GetComponent<Mixer>().LoadTracks(musicFolder);
    }