/// <summary> /// Parse the rpp file. /// </summary> private void Example() { // open the file and parse it parser = new ReaperParser(pathToReaperFile); if (!parser.isValid) { Debug.LogError("The ReaperParser was not initialized."); return; } // get the parsed main ReaperNode object rpp = parser.rpp; // e.g. get the position of the cursor. There is only one value. Value returns always the first of all values. string cursorPosition = rpp.GetNode("CURSOR").value; Debug.Log("The cursor position: " + cursorPosition); // e.g. get the main tempo information of the session. List <string> tempo = rpp.GetNode("TEMPO").values; Debug.Log("Tempo information: " + string.Join(", ", tempo.ToArray())); // e.g. get the name of the first item on the last track string itemName = rpp.GetLastNode("TRACK").GetNode("ITEM").GetNode("NAME").value; Debug.Log("name of the first item on the last track: " + itemName); // load the audio in a coroutine to be sure the audioclip is loaded before assigned to a audiosource StartCoroutine(LoadAudio()); }
/// <summary> /// Parse the reaper file. /// </summary> /// <returns>The top node.</returns> /// <param name="parent">Parent.</param> /// <param name="parser">The parsing ReaperParser.</param> private ReaperNode Parse(ReaperNode parent, ReaperParser parser) { string cl = contentLines[currentLine]; if (cl.Contains("<")) { var newNode = new ReaperNode(cl, parent, parser); // Create a new Node if (currentNode != null) // only happens for the first line <REAPER_PROJECT { currentNode.addChild(newNode); } currentNode = newNode; // Set the current node } else if (cl.Contains(">")) { currentNode = currentNode.parent != null ? currentNode.parent : currentNode; } else if (currentNode != null) { currentNode.addChild(new ReaperNode(cl, currentNode, parser)); } currentLine++; if (currentLine < contentLines.Length) { Parse(currentNode, this); } return(currentNode); }
/// <summary> /// Initializes a new instance of the <see cref="T:UnityReaperParser.ReaperParser"/> class. /// </summary> /// <param name="path">The Absolute Path to the Reaper File .rpp.</param> public ReaperParser(string path) { // Read File and store it to member content try { StreamReader sf = new StreamReader(path); this.content = sf.ReadToEnd(); this.contentLines = content.Split('\n'); rpp = Parse(null, this); this.path = path; this.directory = Path.GetDirectoryName(path); isValid = true; } catch (Exception e) { isValid = false; Debug.LogError(e.ToString()); } }
// public: /// <summary> /// Initializes a new instance of the <see cref="T:ReaperNode"/> class. /// </summary> /// <param name="text">The current line as a string from the reaper file.</param> /// <param name="parent">The parent node. Pass null if there is no parent.</param> /// <param name="parser">The parsing instance of ReaperParser.</param> public ReaperNode(string text, ReaperNode parent, ReaperParser parser) { this.children = new List <ReaperNode>(); this.parser = parser; this.parent = parent; text = text.Trim(); var matches = Regex.Matches(text, "(\"[^\"]*\"|[\\S]+)"); // split the values var matchList = matches.Cast <Match>().Select(match => match.Value).ToList(); // convert matches to string list matchList = matchList.Select(s => s.Trim(new char[] { ' ', '\"', '<', '>' })).ToList(); /* * Try to parse the first element of matches as a float. If it is a * number, the node has no type but only values. if it is not a * number, the first element is the type of the node. */ try { var num = float.Parse(matchList[0]); type = ""; values = matchList; } catch { if (matchList.Count > 0) { type = matchList[0]; matchList.RemoveAt(0); values = matchList; } } }
/// <summary> /// Adds a child. /// </summary> /// <param name="o">O.</param> public void addChild(ReaperNode o) { children.Add(o); }