diff yeti/scratch/generateTemplatesC.yeti @ 30:d697e78f81f1

Add templates in C header form (and conversion program)
author Chris Cannam
date Tue, 01 Apr 2014 17:40:21 +0100
parents
children 461d94ed3816
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/yeti/scratch/generateTemplatesC.yeti	Tue Apr 01 17:40:21 2014 +0100
@@ -0,0 +1,101 @@
+
+program generateTemplatesC;
+
+vec = load may.vector;
+
+instruments = [
+    "bassoon",
+    "cello",
+    "clarinet",
+    "flute",
+    "guitar",
+    "horn",
+    "oboe",
+    "tenorsax",
+    "violin",
+    "piano-maps-SptkBGCl",
+    "piano1",
+    "piano2",
+    "piano3",
+];
+
+dataDir = "../../data";
+includeDir = "\(dataDir)/include";
+
+warning = "/* Do not edit this file: it was automatically generated */";
+
+noteCount = 88;
+templateHeight = 545;
+
+convert instrument lines ostr =
+   (notes = map do line:
+                vec.fromList (map number (strSplit "," line))
+            done lines;
+    if (length notes) != noteCount then
+        failWith "Wrong number of notes in instrument \(instrument): found (\(length notes), expected \(noteCount)";
+    fi;
+    for notes do n:
+        if (vec.length n) != templateHeight then
+            failWith "Wrong number of values in template while processing instrument \(instrument): found \(vec.length n), expected \(templateHeight)";
+        fi
+    done;
+    levels = map vec.sum notes;
+    first = length levels - length (find (>0) levels);
+    last = length (find (>0) (reverse levels)) - 1;
+    ostr.writeln warning;
+    ostr.writeln "";
+    ostr.writeln "{\n    \"\(instrument)\",\n    \(first),\n    \(last),";
+    ostr.writeln "    {";
+    for notes do note:
+        ostr.write "        { ";
+        for (vec.list note) do v:
+            ostr.write "\(v), ";
+        done;
+        ostr.writeln "},";
+    done;
+    ostr.writeln "    }";
+    ostr.writeln "},";
+    ostr.close ()); 
+
+writeMainHeader () =
+   (ostr = openOutFile "\(includeDir)/templates.h" "UTF-8";
+    for [
+        warning,
+        "",
+        "#ifndef SILVET_DATA_TEMPLATES_H",
+        "#define SILVET_DATA_TEMPLATES_H",
+        "",
+        "/* note: intended to parse as both C and C++ */",
+        "",
+        "#define SILVET_TEMPLATE_NOTE_COUNT \(noteCount)",
+        "#define SILVET_TEMPLATE_HEIGHT     \(templateHeight)",
+        "",
+        "typedef struct {",
+        "    const char *name;",
+        "    int lowest;",
+        "    int highest;",
+        "    float data[SILVET_TEMPLATE_NOTE_COUNT][SILVET_TEMPLATE_HEIGHT];",
+        "} silvet_template_t;",
+        "",
+        "static silvet_template_t silvet_templates[\(length instruments)] = {",
+    ] ostr.writeln;
+    for instruments do instrument:
+        ostr.writeln "#include \"\(instrument).h\"";
+    done;
+    for [
+        "};",
+        "",
+        "#endif",
+    ] ostr.writeln;
+    ostr.close ()); 
+
+convertAll () = 
+   (writeMainHeader ();
+    for instruments do instrument:
+        i = openInFile "\(dataDir)/\(instrument).csv" "UTF-8";
+        o = openOutFile "\(includeDir)/\(instrument).h" "UTF-8";
+        eprintln "converting instrument \"\(instrument)\"...";
+        convert instrument (i.lines ()) o;
+    done);
+
+convertAll ();