// JavaScript Document /* ChangeClef.js by OpaGust Installation instructions: Command Line: "Wscript YourScriptsFolder\ChangeClef.js " Input Type: Clip Text Under 'Options: Uncheck 'Returns File Text' */ // Global variables // Parameters var Testing = false; // enables/disables the function ShowVar. var NPrompts = 3; var InputType = "Clip"; var ReturnFormat = "Clip"; var HelpTxt = "This tool changes the clef, moving all notes and chords up or down appropriately.\r\n" + "It works on the selected items or on the whole staff, if nothing is selected.\r\n" + "In a selection, a clef must be present; the notes and chords before the clef remain unchanged.\r\n\r\n" + "User input: new clef, octave shift and execution mode.\r\n" + "There are three execution modes: 'Modify' is the normal mode, 'Show' shows the generated output in stdout (without modifying your file), 'Help' shows this text."; // end Parameters var RC=0; // Returncode var ClipInput = ""; // Inputstream from STDIN var F=0; //Loopvariable var Lines = new Array(); // Lines from inputstream var L=0; // Index of Lines var CurLine = ""; // Current occurence of array Lines var PrevItem = ""; var Parts = new Array(); // Parts of CurLine after 'splitting' it using delimiter "|". var NLines=new Array(); // OutputLines for STDOUT var LL=0; // Index of NLines var Retain=true; // enables/disables copying a line from STDIN to STDOUT var EmptyMeasure = true; var MeasureNumber = -1; var Selection = false; var OldClef = ""; var OldOctShift = ""; var NewClef = ""; var NewOctShift = ""; var OldValue = 0; var NewValue = 0; // End Global Variables // function Declarations function QuitError(ErrMsg) { WScript.StdErr.Write(ErrMsg); WScript.quit(1); } // end function QuitError function ShowHelp(){ WScript.StdErr.Write(HelpTxt); WScript.quit(1); } // end function ShowHelpFile function ShowVar(Txt, Val) { if (Testing) { WScript.StdErr.Write(Txt + "==> " + Val+ "\r\n"); } } // end function ShowVar function ProcessPrompts(p) { var userprompt = WScript.Arguments.Item(p); switch (p) { case 0: if (userprompt != "Bass" && userprompt !="Treble" && userprompt !="Alto" && userprompt !="Tenor" && userprompt !="Percussion") QuitError("Invalid new clef '" + userprompt + "'"); NewClef = userprompt; break; case 1: if (userprompt != "None" && userprompt !="Octave_Up" && userprompt !="Octave_Down") QuitError("Invalid octave shift '" + userprompt + "'"); NewOctShift = userprompt; NewOctShift = NewOctShift.replace("_"," "); break; case NPrompts - 1: if (userprompt == "Show"){ RC = 99; break;} if (userprompt == "Help") ShowHelp(); if (userprompt == "Test") {Testing = true; break;} if (userprompt != "Modify") QuitError("Invalid Execution mode '" + userprompt + "'"); // case 0: // case ... } } // End function ProcessPrompt function GetProp(prop){; prop += ":"; var pl = prop.length; for (var p = 2; p < Parts.length; p++) { var head = Parts[p].substr(0,pl); if (head == prop) return(Parts[p].slice(pl)); // prop found } // end for return("*"); // prop not found } // end GetProp function SetProp(prop, op, val){; var newval; switch (op){ case "=" : newval = val; break; case "+" : newval +=val; break; case "-" : newval -=val; break; case "*" : newval *=val; break; case "/" : newval /=val; break; case "%" : newval %=val; break; } // end switch prop += ":"; var pl = prop.length; for (var p = 2; p < Parts.length; p++) { var head = Parts[p].substr(0,pl); if (head == prop) { // prop found, set val Parts[p] = prop + newval; CurLine = Parts.join("|"); return; } // end if } // end for // prop not found, add prop Parts[Parts.length] = prop + val; CurLine = Parts.join("|"); return; } // end SetProp function GetOpt(opt){; var optpart = GetProp("Opts"); if (optpart == "*") return("**"); // No Opts present in Current Line. var optarray = optpart.split(","); opt += "="; var ol = opt.length; for (var o = 0; o < optarray.length; o++) { var head = optarray[o].substr(0,ol); if (head == opt) return(optarray[o].slice(ol)); // opt found } // end for return("*"); // opt not found } // end GetOpt function SetOpt(opt, op, val){; ShowVar("SetOpt", opt + op + val); var oldprop = GetOpt(opt); opt += "="; var oldval = oldprop; if ((oldval == "*") || (oldval == "**") && (op != "=")) oldval = 0; var newval; if (op != "=") { oldval = parseInt(oldval); val = parseInt(val); } // end if var newval; switch (op){ case "=" : newval = val; break; case "+" : newval = oldval + val; break; case "-" : newval = oldval - val; break; case "*" : newval = oldval * val; break; case "/" : newval = oldval / val; break; default : QuitError("Invalid operator " + op + " in function SetProp"); } // end switch if (oldprop == "**"){ // no Opts present in Current Line, add Opts. SetProp("Opts", "=", opt + newval) return; } //end if var optpart = GetProp("Opts"); var optarray = optpart.split(","); ShowVar("optarray", optarray); var ol = opt.length; for (var o = 0; o < optarray.length; o++) { var head = optarray[o].substr(0,ol); ShowVar("head", head); if (head == opt) { // opt found, modify optarray element optarray[o] = opt + newval; optpart = optarray.join(","); SetProp("Opts", "=", optarray); return; } // end if } // end for // opt not found, add an element to optarray optarray[optarray.length] = opt + newval; optpart = optarray.join(","); SetProp("Opts", "=", optarray); return; } // end SetOpt function ModRestPos(nshift){ SetOpt("VertOffset", "+", nshift); return; } // end ModRestPos function ModPositions (nshift) { // This function moves an item (except rests) up or down. var minpos = 999; var maxpos = -999; var posprop = new Array("Pos","Pos2"); for (var pi in posprop){ var pospart = GetProp(posprop[pi]); if (pospart != "*") { var posarray = pospart.split(","); for (var mj=0; mj < posarray.length; mj++) { switch (posarray[mj].substr(0,1)){ case "n": case "b": case "#": case "x": case "v": var ps = 1; break; default: ps = 0; } // end switch var pos = parseInt(posarray[mj].slice(ps)); var newpos= pos+nshift; if (newpos < minpos) minpos = newpos; if (newpos > maxpos) maxpos = newpos; posarray[mj] = posarray[mj].replace(pos,newpos); } // end for mj pospart = posarray.join(","); SetProp(posprop[pi], "=", pospart); } // end if } // end for if(Parts[1] == "RestChord"){ if (maxpos < 0) SetOpt("Stem", "=", "Up"); else { if (minpos > 0) SetOpt("Stem", "=", "Down"); else { var abspos = Math.abs(minpos); if (Math.max(abspos, maxpos) < 0) SetOpt("Stem", "=", "Up"); else SetOpt("Stem", "=", "Down"); } // end else } // end else } // end if } // end ModPositions function CalculateValue (clef, octave) { var val = 0; switch (clef) { // position of middle c case "Bass": val = 6; break; case "Treble": val = -6; break; case "Alto": val = 0; break; case "Tenor": val = 2; break; case "Percussion": val = 6; break; }// end switch (Sleutel) switch (octave) { case "None": break; case "Octave Up": val = val - 7; break; case "Octave Down": val = val + 7; break; } // end switch (octave) return (val); } function ProcessClipTextLine(){ ShowVar("Testing", Testing); return; } function ProcessClipEnd(){ if (OldClef == "") QuitError ("Clef must be in selection!") return; } function ProcessClef() { var lgt = Parts.length; OldClef = Parts[2].slice(5); Parts[2] = Parts[2].replace(OldClef,NewClef); for (var j = 1; j < lgt; j++){ if (Parts[j].slice(0,12) == "OctaveShift:"){ OldOctShift = Parts[j].slice(12); Parts[j] = Parts[j].replace(OldOctShift,NewOctShift); } // end if } // end for if (OldOctShift == ""){ OldOctShift = "None"; for (j = lgt; j > 3; j--){ Parts[j] = Parts[j-1]; } Parts[3] = "OctaveShift:" + NewOctShift; } // end if if (lgt == 3) { OldOctShift = "None"; Parts[3] = "OctaveShift:" + NewOctShift; } // end if OldValue = CalculateValue (OldClef, OldOctShift); CurLine = Parts.join("|"); return; } function ProcessNote() { if (OldClef == "") return; ModPositions(NewValue - OldValue); return; } function ProcessChord() { if (OldClef == "") return; ModPositions(NewValue - OldValue); return; } function ProcessRestChord() { if (OldClef == "") return; ModPositions(NewValue - OldValue); return; } function ProcessLine () { Retain = true; if (CurLine.substr(0,24) == "!NoteWorthyComposerClip("){ ProcessClipTextLine(); return;} if (CurLine.substr(0,27) == "!NoteWorthyComposerClip-End") { ProcessClipEnd(); return;} if (CurLine.substr(0,1) == "|") { Parts = CurLine.split("|"); switch (Parts[1]) { case "Clef": ProcessClef(); break; case "Note": ProcessNote(); break; case "Chord": ProcessChord(); break; case "RestChord": ProcessRestChord(); break; } // end switch PrevItem = Parts[1]; } return; } // End function ProcessLine function CheckInstallation() { if (WScript.Arguments.length != NPrompts) QuitError("Number of prompts needed: " + NPrompts); if (Lines[0].substr(0,24) != "!NoteWorthyComposerClip(") QuitError("Input type must be 'Clip Text'"); } // End function Declarations // Main Processing block ClipInput = WScript.StdIn.ReadAll(); Lines = ClipInput.split("\r\n"); CheckInstallation(); for (F=0; F < NPrompts; F++){ ProcessPrompts(F); } // End for F NewValue = CalculateValue(NewClef, NewOctShift); for (L=0; L < Lines.length; L++){ CurLine = Lines[L] ProcessLine(); if (Retain) NLines[LL++] = CurLine; } // End for L WScript.StdOut.Write(NLines.join("\r\n")); WScript.quit(RC);