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