Skip to main content

Topics

This section allows you to view all Topics made by this member. Note that you can only see Topics made in areas you currently have access to.

Topics - Warren Porter

1
General Discussion / Shutting down my website
I regret to announce that I will be shutting down my website later this month. If there are any pages or scripts you use frequently or used to use that don't work as well now, please let me know now. I'll do my best to debug / document what I can before pulling the plug.

Richard has offered to host my NWC folder on Scriptorium and I thank him for that.

wjporter.com/nwc
2
General Discussion / Fermatas vs Arpeggios
In this snippet I have a fermata in the last measure where a chord in the piano is arpeggiated. When played, there are a few extra notes added to the measure.

Is there any way to make this work or workaround?

TIA
3
General Discussion / Hiding objects on a staff
Without going through the process of hidden-played, muted-displayed staves for every part, is there a way to make the following look like pentuplet 16ths by hiding the top beam and the dots on 32nd notes?
Code: (nwc) [Select · Download]
!NoteWorthyComposerClip(2.751,Single)
|Key|Signature:F#,C#,G#,D#|Tonic:E
|Note|Dur:32nd,Dotted,Slur|Pos:8|Opts:Stem=Down,Beam=First
|Note|Dur:32nd,DblDotted,Slur|Pos:5|Opts:Stem=Down,Beam
|Note|Dur:32nd,Dotted,Slur|Pos:3|Opts:Stem=Down,Beam
|Note|Dur:32nd,DblDotted,Slur|Pos:1|Opts:Stem=Down,Beam
|Note|Dur:32nd,Dotted,Slur|Pos:-2|Opts:Stem=Down,Beam=End
|Note|Dur:32nd,Dotted,Slur|Pos:-6|Opts:Stem=Down,Beam=First
|Note|Dur:32nd,DblDotted,Slur|Pos:-2|Opts:Stem=Down,Beam
|Note|Dur:32nd,Dotted,Slur|Pos:1|Opts:Stem=Down,Beam
|Note|Dur:32nd,DblDotted,Slur|Pos:3|Opts:Stem=Down,Beam
|Note|Dur:32nd,Dotted|Pos:5|Opts:Stem=Down,Beam=End
|Note|Dur:32nd,Dotted,Slur|Pos:8|Opts:Stem=Down,Beam=First
|Note|Dur:32nd,DblDotted,Slur|Pos:5|Opts:Stem=Down,Beam
|Note|Dur:32nd,Dotted,Slur|Pos:3|Opts:Stem=Down,Beam
|Note|Dur:32nd,DblDotted,Slur|Pos:1|Opts:Stem=Down,Beam
|Note|Dur:32nd,Dotted,Slur|Pos:-2|Opts:Stem=Down,Beam=End
|Note|Dur:32nd,Dotted,Slur|Pos:-6|Opts:Stem=Down,Beam=First
|Note|Dur:32nd,DblDotted,Slur|Pos:-2|Opts:Stem=Down,Beam
|Note|Dur:32nd,Dotted,Slur|Pos:1|Opts:Stem=Down,Beam
|Note|Dur:32nd,DblDotted,Slur|Pos:3|Opts:Stem=Down,Beam
|Note|Dur:32nd,Dotted|Pos:5|Opts:Stem=Down,Beam=End
|Bar
!NoteWorthyComposerClip-End

Thanks in advance.
4
General Discussion / Duration parts in NwcTxt
When something on the staff has a duration, can there be anything else in the Dur: field outside of note length, dot or triplet status, and presence of a slur?  If I need to change the duration of a note or chord, I need to keep the slur intact.

Anything else to be on the alert for? I need to clear this up before converting ThreeEight.html to a user tool.

TIA
5
General Discussion / Christmas humor.
I saw this in a Music Humor group--the copyright notice gave the right to share, so I swapped out the lyrics. Don't know how to not play the refrain in verses 2 and 3 though.
6
General Discussion / Is the NWC Viewer/Player available as a webpage
Quite a few years ago there was a NWC page that played the Mendelssohn Violin Concerto without the need for the user to have any NWC product installed. Is there anything like that now and, if so, how would it be directed to play the specified .nwc file?

TIA

This is how it looks on another system: score.
9
Tips & Tricks / Guidelines for posting in Tips & Tricks
If you have a useful technique, script, function, or object  to share with other NWC users, this is the place to post it.  If you want to know "How do I ..." please put it in the General Discussion section.
TIA
10
General Discussion / Flow problem
In transcribing a minuet, the Trio consists of two repeated sections. The first part repeats with no problem but the second part goes da capo after only playing once.
Code: (nwc) [Select · Download]
!NoteWorthyComposer(2.751)
|Editor|ActiveStaff:1|CaretIndex:1|CaretPos:0
|SongInfo|Title:"Eine Kleine Nachtmusik K. 525 2 - Romanze"|Author:"Mozart"|Lyricist:""|Copyright1:""|Copyright2:""|Comments:"Transcription: Warren Porter"
|PgSetup|StaffSize:18|Zoom:4|TitlePage:Y|JustifyVertically:Y|PrintSystemSepMark:N|ExtendLastSystem:N|DurationPadding:Y|PageNumbers:1|StaffLabels:First System|BarNumbers:Boxed|StartingBar:0
|Font|Style:StaffItalic|Typeface:"Times New Roman"|Size:11.45|Bold:Y|Italic:Y|CharSet:0
|Font|Style:StaffBold|Typeface:"Times New Roman"|Size:8.18|Bold:Y|Italic:N|CharSet:0
|Font|Style:StaffLyric|Typeface:"Times New Roman"|Size:8.18|Bold:N|Italic:N|CharSet:0
|Font|Style:PageTitleText|Typeface:"Times New Roman"|Size:24|Bold:Y|Italic:N|CharSet:0
|Font|Style:PageText|Typeface:"Times New Roman"|Size:12|Bold:N|Italic:N|CharSet:0
|Font|Style:PageSmallText|Typeface:"Times New Roman"|Size:8|Bold:N|Italic:N|CharSet:0
|Font|Style:User1|Typeface:"AR DECODE"|Size:72|Bold:N|Italic:N|CharSet:1
|Font|Style:User2|Typeface:"Times New Roman"|Size:5|Bold:N|Italic:N|CharSet:0
|Font|Style:User3|Typeface:"Times New Roman"|Size:5|Bold:N|Italic:N|CharSet:0
|Font|Style:User4|Typeface:"Times New Roman"|Size:5|Bold:N|Italic:N|CharSet:0
|Font|Style:User5|Typeface:"Times New Roman"|Size:8|Bold:N|Italic:N|CharSet:0
|Font|Style:User6|Typeface:"Times New Roman"|Size:8|Bold:N|Italic:N|CharSet:0
|PgMargins|Left:2.54|Top:2.54|Right:2.54|Bottom:2.54|Mirror:N
|AddStaff|Name:"Conductor"|Group:"Standard"
|StaffProperties|EndingBar:Master Repeat Close|Visible:Y|BoundaryTop:10|BoundaryBottom:10|Lines:1|WithNextStaff:Layer|Color:Default
|StaffProperties|Muted:N|Volume:127|StereoPan:64|Device:0|Channel:6
|StaffInstrument|Trans:0|DynVel:10,30,45,60,75,92,108,127
|TimeSig|Signature:3/4
|Spacer|Width:125
|Tempo|Tempo:168|Text:"Allegretto"|Pos:10.5
|Rest|Dur:4th|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Whole|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Whole|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Whole|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Half|Visibility:Never
|Bar|Style:MasterRepeatClose|XBarCnt:Y
|Bar|Style:MasterRepeatOpen|XBarCnt:Y
|Rest|Dur:4th|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Whole|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Whole|Visibility:Never
|Bar
|Rest|Dur:Whole|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Half|Visibility:Never
|Flow|Style:Fine|Pos:-8|Wide:Y
|Bar|Style:MasterRepeatClose|XBarCnt:Y
|Bar|Style:MasterRepeatOpen|XBarCnt:Y
|Text|Text:"Trio"|Font:PageTitleText|Pos:10.5
|Rest|Dur:4th|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Whole|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Whole|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Half|Visibility:Never
|Bar|Style:MasterRepeatClose|XBarCnt:Y
|Bar|Style:MasterRepeatOpen|XBarCnt:Y
|Rest|Dur:4th|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Whole|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Whole|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Whole|Visibility:Never
|Bar|Visibility:Never
|Rest|Dur:Half|Visibility:Never
|Flow|Style:DCalFine|Pos:-7|Wide:Y
!NoteWorthyComposer-End
How do I get the last section to repeat?
TIA
11
General Discussion / Reading staff symbols
I am working on a function looking for accidentals as text in StaffCueSymbols. Sometimes it is only one character, sometimes it is three high ASCII characters. When I used stdErr for debugging, I get a character looking like a lowercase m with something dragging to the right (see picture).  What is that character?  Is it possible to read and interpret the text for a special font?

In the following code saveText is the content of the quoted character(s) without spaces.
Code: [Select · Download]
	switch(saveText) {
case "e":
case "?":
case "∩üÑ":  //Natural
    saveAcc = "n";
break;
case "f":
case "∩üª":  //Flat
    saveAcc = "b";
break;
case "d":
case "∩üñ":  //Sharp
    saveAcc = "#";
break;
case "g":             // Double sharp
case "":
    saveAcc = "x";
break;
case "h":             // Double Flat
case "":
    saveAcc = "v";
break;
default:
    errMsg+= ti + "->" + saveText + "<- " + lines[i] + "\n";
    errMsg += "Couldn't find accidental in " + lines[ti], rc = 1; return lines; // change += to = when live
}
12
General Discussion / Object for turns
I am trying to avoid adding a hidden/played staff to a 4 part piece I'm transcribing. The objects work well for trills and tremolos, but is there something to do turns?  If not, what is a good resource for writing objects in lua?

Attached is a short example.

TIA
15
General Discussion / Rest Chords from midi files?
Yesterday, to help celebrate our anniversary, I visited Let Me Call You Sweetheart to get a midi file from which to start.  On the Sheet Music tab, RestChords in the right hand piano part are used in the majority of the song but on the midi file these are nowhere to be found--just a quarter note starting most measures that cuts off on the 2nd beat.  I changed the first measure into the second measure in the following with a recorded keystroke macro working with a nwctxt version of the song.
Code: (nwc) [Select · Download]
!NoteWorthyComposerClip(2.751,Single)
|Bar
|Note|Dur:4th|Pos:-3
|Chord|Dur:4th|Pos:#-8,-4
|Chord|Dur:4th|Pos:-8,-4,-2
|Bar
|RestChord|Dur:4th|Opts:Stem=Down,ArticulationsOnStem|Dur2:Half|Pos2:-3
|Chord|Dur:4th|Pos:#-8,-4|Opts:Stem=Down
|Chord|Dur:4th|Pos:-8,-4,-2
!NoteWorthyComposerClip-End
Is there a better way to fix this?

Related to this file, the first time through it is piano, second time forte.  In addition there are crescendos and decrescendos.  Would putting a p just before the open repeat with a f before the close repeat help with hairpins in place?
17
Object Plugins / Primer for writing NWC Objects?
I am trying to grasp the trill object and while I understand parts of it, I am a long way for having a handle on it.  Is there a primer or template for creating an object to add, remove, or change what NWC would normally show or print?  Same for what happens during playback?  Is there a library of functions with instructions on how and when to use them?

TIA
18
General Discussion / Slur into grace notes
On bowed string instrument, a slur indicates a number of notes to be played on one bow. In this section, a half note slurs into a number of grace notes but the bow changes direction on the next measure.

Is there any way to notate this?  Any workarounds?

TIA
19
General Discussion / Gliss going the wrong way
In this snippet from Souvenir
Code: (nwc) [Select · Download]
!NoteWorthyComposerClip(2.751,Single)
|Dynamic|Style:f|Pos:-11
|Note|Dur:Half|Pos:10^
|Note|Dur:8th,Dotted|Pos:10|Opts:Stem=Down,Beam=First
|Text|Text:"2"|Font:StaffItalic|Pos:13|Placement:AtNextNote
|Note|Dur:16th,Slur|Pos:7|Opts:Stem=Down,Beam=End
|Bar
|User|Glissando.ms|Pos:8|Text:|Weight:1.4
|Text|Text:"2"|Font:StaffItalic|Pos:14|Placement:AtNextNote
|Note|Dur:Half|Pos:9^|Opts:Diminuendo
|Note|Dur:8th,Dotted|Pos:9|Opts:Stem=Down,Diminuendo,Beam=First
|Text|Text:"1"|Font:StaffItalic|Pos:12|Placement:AtNextNote
|Note|Dur:16th,Slur|Pos:8|Opts:Stem=Down,Diminuendo,Beam=End
|Bar
|Text|Text:"1"|Font:StaffItalic|Pos:8|Placement:AtNextNote
|User|Glissando.ms|Pos:8|Text:|Weight:1.4
|Note|Dur:Half,Dotted|Pos:4^|Opts:Diminuendo
!NoteWorthyComposerClip-End
the violin is sliding from a C# down to a F# but the slide is going up.  How do I fix this?
TIA
20
General Discussion / User tools problem
I just replaced nummeas.js on my NWC Tools page after someone told me it wasn't working.  If you have a problem with something on that page, please let me know and I'll take a look at it.
21
General Discussion / Fast forward and wait
When using NWC for accompaniment, there are a capella passages (like a cadenza) or the other instrument hasn't come in yet such as Ashokan Farewell before the guitar enters.  Someone else would hit the "Resume" key (or soloist with a foot pedal) when the accompaniment returns.

Has anyone else run into this problem?  Any workarounds?

TIA
22
User Tools / Turn grace notes into real ones.
This script turns grace notes into real ones and steals time from either the prior note or the following one.

There is no undo with this so either save before using or on a copy from another staff.
Code: [Select · Download]
/* Notes to Rests by Warren Porter "graceFix.js"
   After downloading this file, when setting it up in NWC User Tools create this command line:

   wscript "'Browse can insert the path for you' \graceFix.js" <PROMPT:Which?:=|Prev|Next>

   This converts grace notes to real ones while reducing the duration of the previous object.  First, copy an entire staff (which
   you will make visible and muted) to the clipboard, create a new staff (will eventually be hidden and played),
   then copy the clipboard to the new staff.  Run this command on that new staff.  Notes, chords, or rests which are followed
   by grace notes will be shortened by the (total) duration of the grace notes and the grace attribute will be removed.
   The original (and still on the displayed/muted staff) grace notes will now sound BEFORE the beat instead of ON the beat.
  
   Change:  You can take time from the note/chord AFTER the grace note(s) by chosing "Next"

 */
 //  Substitutions: Wscript.Arguments <-> parms
 //                 Item(n)            <-> [n]


var rc=0, errMsg="", Wscript_Arguments = new Array();
var NoteLengths = [ "Whole", "Half", "4th", "8th", "16th", "32nd", "64th", "128th", "256th", "512th", "1024th" ] ;
var SearchDur;


function getNoteLength(notelet) {  // Returns duration of note , whole = 768
//   var shell = new ActiveXObject("WScript.Shell");
parts = notelet.split(","), numParts=1;
var  noteLength= -1, searchstr="";
searchstr = parts[0].substr(0,3);
//shell.Popup(parts[0])
switch (searchstr) {
case "Who" : noteLength = 768; break;
case "Hal" : noteLength = 384; break;
case "4th" : noteLength = 192; break;
case "8th" : noteLength =  96; break;
case "16t" : noteLength =  48; break;
case "32n" : noteLength =  24; break;
case "64t" : noteLength =  12; break;
default:     noteLength =  -1;
}
  if (noteLength == -1)
    return -1;

  for (var i = 1; i < parts.length; i++) {
    if (parts[i].substr(0,9) == "DblDotted") {
  numParts=2;
  noteLength = noteLength * 7 / 4; }
else
      if (parts[i].substr(0,6) == "Dotted") {
  numParts=2;
    noteLength = noteLength * 3 / 2; }
  else
    if (parts[i].substr(0,7) == "Triplet") {
  numParts=2;
      noteLength = noteLength * 2 / 3; } }
  SearchDur = (numParts == 1)? parts[0]: parts[0] + "," + parts[1]
  return noteLength;
}

function doNext(clip) {
  var i, durTable = new Array(), newDur, binString="", saveDur, subDur=0, durSub = new Array(), saveOrig, newStrings = new Array();
  var lines = new Array(), result = new Array(), lastDur = 0, locDur=0, locGraceFst, locGraceLst, durGrace, sumGrace=0
  var saveBar="", locBar= -1, wholeRest=768;
  lines = clip.split("\n");

  for (i=0; i < lines.length; i++) {
      result=lines[i].match(/Dur:([^\|]*)/);
  if (sumGrace && (result == null)) {
  errMsg="Unattached Grace note";
  rc=1;
  return lines; }
  if (result == null)
  continue;  // No duration, didn't follow grace note.
  if (lines[i].indexOf("Grace") > 0) {  // Found a grace note/chord
durGrace = getNoteLength(result[1]);  // Find duration
sumGrace+= durGrace;   // Sum of grace notes so far
    lines[i]=lines[i].replace(",Grace","");  // Remove grace attribute
        continue;  }
  if (!sumGrace) // If has duration, is not grace, and doesn't follow grace
  continue;  // Ignore
  /*
  At this point something with a duration follows (a) Grace Note/Chord(s) and its duration must be reduced
  by sumGrace.
   */
    lastDur = getNoteLength(result[1]);
saveDur = SearchDur;
  newDur = (lastDur - sumGrace)
  if ((newDur % 3) != 0) {
    lines[i]+="\n|Text|Text:\"Can't do triplets.\"|Font:StaffItalic|Pos:10|Color:1"
            break; }
          newDur /= 3;
  if (newDur < 4) {
    errMsg="Note to convert isn't long enough, aborting.";
rc=1;
return lines;}
  binString=""
  for (var ii=0; ii < 9; ii++) {   //Convert to binary
    binString = (newDur % 2) + binString;
newDur = Math.floor(newDur/2); }
  durTable.length = 0, subDur=0;
  while (binString != "000000000") {
    for (ii=0; ii < 3; ii++)
  durSub[ii] = Number.POSITIVE_INFINITY;
    result = binString.match("111")
if (result != null)
  durSub[0] = result.index;
    result = binString.match("110")
if (result != null)
  durSub[1] = result.index;
    result = binString.match("10")
if (result != null)
  durSub[2] = result.index;
if (durSub[0] <= durSub[1] && durSub[0] <= durSub[2]) {
  durTable[subDur++] = NoteLengths[durSub[0]] + ",DblDotted";
  binString = binString.replace("111","000");
  continue;}
if (durSub[1] < durSub[0] && durSub[1] <= durSub[2]) {
  durTable[subDur++] = NoteLengths[durSub[1]] + ",Dotted";
  binString = binString.replace("11","00");
  continue;}
if (durSub[2] < durSub[0] && durSub[2] < durSub[1]) {
  durTable[subDur++] = NoteLengths[durSub[2]];
  binString = binString.replace("1","0");
  continue;}  }
// Code to manipulate durations goes here
saveOrig = lines[i];  // Save so can modify it several times if necess;
newStrings.length = 0;
for (ii = 0; ii < subDur;ii++) {
  newStrings[ii] = saveOrig.replace(saveDur,durTable[ii]);
      if (((subDur - 1) > ii) && (saveOrig.slice(0,6) != "|Rest|")) {
    newStrings[ii] = newStrings[ii].replace(/(\d),/g, "$1^,"); ;
    newStrings[ii] = newStrings[ii].replace(/$/, "^");
    newStrings[ii] = newStrings[ii].replace("^^", "^"); } }
lines[i] = newStrings.join("\r\n");
    sumGrace=0; } // So will not try to apply reductions again.

  return lines;
}

function doPrev(clip) {
  var i, durTable = new Array(), newDur, binString="", saveDur, subDur=0, durSub = new Array(), saveOrig, newStrings = new Array();
  var lines = new Array(), result = new Array(), lastDur = 0, locDur=0, locGraceFst, locGraceLst, durGrace, sumGrace=0
  var saveBar="", locBar= -1, wholeRest=768;
 // lines = clip.split("\r\n");

  lines = clip.split("\n");
  for (i=0; i < lines.length; i++) {
      if (lines[i].slice(0,4) == "|Bar")  {
saveBar = lines[i];
locBar=i;
continue;
  }
  if (lines[i].slice(0,8) == "|TimeSig") {
    result = lines[i].match(/re:(\d+)\/(\d+)/);
if (result != null)
  wholeRest = 768 * result[1] / result[2];
continue; }
      result=lines[i].match(/Dur:([^\|]*)/);
  if (result == null)
    continue;
      if (lines[i].indexOf("Grace") == -1) { // Found something with duration not a grace note
        lastDur = getNoteLength(result[1]);
saveDur = SearchDur;
locBar= -1;  // This measure didn't start with (a) grace(s) note/chord.
locDur = i;
        if (lines[i].slice(0,5) == "|Rest" && lastDur == 768)
  lastDur = wholeRest; }  // In case we need it.
  else  { // Found a grace note to convert
  locGraceFst=i;
  sumGrace=0;
  for (locGraceLst=i; locGraceLst < lines.length; locGraceLst++) {
    result=lines[locGraceLst].match(/Dur:([^\|]*)/);
var buggy = lines[locGraceLst].indexOf("Grace");
// if ((result == null) || (lines[locGraceLst].indexOf("Grace") > -1)) {// Doesn't have duration or not grace
//   break; }
    if (result == null)
  break;
if (buggy == -1)
  break;
    durGrace = getNoteLength(result[1]);
sumGrace+= durGrace;}
  locGraceLst--;
  if (locDur > 0)  {  //There was something with duration earlier so will have to reduce it.
  newDur = (lastDur - sumGrace)
  if ((newDur % 3) != 0) {
    lines[locGraceLst]+="\n|Text|Text:\"Can't do triplets.\"|Font:StaffItalic|Pos:10|Color:1"
            break; }
          newDur /= 3;
  if (newDur < 4) {
    errMsg="Note to convert isn't long enough, aborting.";
rc=1;
return lines;}
  binString=""
  for (var ii=0; ii < 9; ii++) {   //Convert to binary
    binString = (newDur % 2) + binString;
newDur = Math.floor(newDur/2); }
  durTable.length = 0, subDur=0;
  while (binString != "000000000") {
    for (ii=0; ii < 3; ii++)
  durSub[ii] = Number.POSITIVE_INFINITY;
    result = binString.match("111")
if (result != null)
  durSub[0] = result.index;
    result = binString.match("110")
if (result != null)
  durSub[1] = result.index;
    result = binString.match("10")
if (result != null)
  durSub[2] = result.index;
if (durSub[0] <= durSub[1] && durSub[0] <= durSub[2]) {
  durTable[subDur++] = NoteLengths[durSub[0]] + ",DblDotted";
  binString = binString.replace("111","000");
  continue;}
if (durSub[1] < durSub[0] && durSub[1] <= durSub[2]) {
  durTable[subDur++] = NoteLengths[durSub[1]] + ",Dotted";
  binString = binString.replace("11","00");
  continue;}
if (durSub[2] < durSub[0] && durSub[2] < durSub[1]) {
  durTable[subDur++] = NoteLengths[durSub[2]];
  binString = binString.replace("1","0");
  continue;}  }
// Code to manipulate durations goes here
saveOrig = lines[locDur];  // Save so can modify it several times if necess;
newStrings.length = 0;
for (ii = 0; ii < subDur;ii++) {
  newStrings[ii] = saveOrig.replace(saveDur,durTable[ii]);
      if (((subDur - 1) > ii) && (saveOrig.slice(0,6) != "|Rest|")) {
    newStrings[ii] = newStrings[ii].replace(/(\d),/g, "$1^,"); ;
    newStrings[ii] = newStrings[ii].replace(/$/, "^");
    newStrings[ii] = newStrings[ii].replace("^^", "^"); } }
lines[locDur] = newStrings.join("\r\n"); }
for (ii = locGraceFst; ii <= locGraceLst; ii++)
  lines[ii]=lines[ii].replace(",Grace","");
if (locBar > -1) {
      lines[locGraceLst]+= "\n" + saveBar; // Add barline after the grace notes
      lines[locBar] = "#"; }  // Turn original bar into a comment.
if (locDur == 0)
  lines[locGraceLst]+="\n|Bar\n|Text|Text:\"New bar added\"|Font:StaffItalic|Pos:8|Color:1";
i=locGraceLst; // So won't try to redo the same string of grace notes.
 }
  }  //End main processing loop
  return lines;
}

var myLines;
  if (WScript.Arguments.length != 1) {
    errMsg="NO Prompt read.";
rc=1; }
  else {
    if (WScript.Arguments.Item(0).slice(0,4) == "Prev")
  myLines=doPrev(WScript.StdIn.ReadAll()).join("\r\n");
else
  myLines=doNext(WScript.StdIn.ReadAll()).join("\r\n"); }

if (rc == 0)
  WScript.StdOut.Write(myLines);
else
  WScript.StdErr.Write(errMsg);
WScript.quit(rc);

Edit: Change documentation in first few lines of the script.
23
General Discussion / Stuck pedal makes other part stacatto.
I was revisiting a Grieg sonata I worked on quite a few years ago to put pedal markings in it.  The last pedal mark I had was down and until I fixed it the violin part had nothing but short notes, regardless of note lengths and slurs.  A score review showed each staff with a different midi channel (not 10).  Any idea why?

TIA
24
Tips & Tricks / Swapping between 4 and 2 staves for a chorus.
Printed scores for (especially) major choral works may alternate between one staff per part (i.e., a fugue) or having sopranos and altos sharing a staff with tenors and basses doing likewise for a chorale.  This may seem impossible to do in NoteWorthy since a staff is either layered or unlayered for the whole file.

The workaround is to give sopranos and tenors an extra staff each--the top one stands alone and the bottom one is layered with the next part.  By using boundary collapse commands and stop boundary collapse commands on either side of a bar line, the two soprano and tenor parts will never be on the printed parts at the same time.  They should also share the same midi channel and use the same midi patch (like Choral Aahs).

When two parts share (by layering) a staff, it will be necessary to force stem direction and perhaps slur and tie direction as well.  Also, extra space may be needed for notes and/or accidentals when the notes are too close to each other otherwise.  See the attachment for an example.
25
General Discussion / Recording video and sound from NWC playback
Is there a way to record NWC playback without having to use another camera or cellphone.  I have been trying to use some free products from VSDC, but can't get off the ground.  Also, I don't have the option of recording audio.

Am open to ideas.  TIA
26
General Discussion / Putting notes in the other staff in piano music
I am trying to transcribe some fast arpeggios and sometimes a note or two at the beginning or ending of a beamed set will be on the other staff, perhaps with an N shaped beam (notes out of both sides).

Does anyone have a workaround for this?  TIA

Finishing Grieg III Sonata for Violin & Piano
30
General Discussion / Can't see verse three notechase with da capo & coda
I am transcribing a song with three verses--there is a simple repeat w/ 1st and 2nd endings, an instrumental interlude, the rrd verse and a coda.  Lyrics for the first two verses turn red when that note is reached, but nothing happens to 3rd verse lyrics.  Any ideas or useful previous threads on this?  TIA
Code: (nwc) [Select · Download]
!NoteWorthyComposer(2.751)
|Editor|ActiveStaff:1|CaretIndex:5|CaretPos:0
|SongInfo|Title:""|Author:"<Name>"|Lyricist:""|Copyright1:"Copyright © 2008 <Name>"|Copyright2:"All Rights Reserved"
|PgSetup|StaffSize:16|Zoom:4|TitlePage:Y|JustifyVertically:Y|PrintSystemSepMark:N|ExtendLastSystem:N|DurationPadding:Y|PageNumbers:0|StaffLabels:None|BarNumbers:None|StartingBar:1
|Font|Style:StaffItalic|Typeface:"Times New Roman"|Size:10|Bold:Y|Italic:Y|CharSet:0
|Font|Style:StaffBold|Typeface:"Times New Roman"|Size:8|Bold:Y|Italic:N|CharSet:0
|Font|Style:StaffLyric|Typeface:"Times New Roman"|Size:7|Bold:N|Italic:N|CharSet:0
|Font|Style:PageTitleText|Typeface:"Times New Roman"|Size:24|Bold:Y|Italic:N|CharSet:0
|Font|Style:PageText|Typeface:"Times New Roman"|Size:12|Bold:N|Italic:N|CharSet:0
|Font|Style:PageSmallText|Typeface:"Times New Roman"|Size:8|Bold:N|Italic:N|CharSet:0
|Font|Style:User1|Typeface:"Boxmark2"|Size:16|Bold:N|Italic:N|CharSet:0
|Font|Style:User2|Typeface:"Times New Roman"|Size:8|Bold:N|Italic:N|CharSet:0
|Font|Style:User3|Typeface:"Times New Roman"|Size:8|Bold:N|Italic:N|CharSet:0
|Font|Style:User4|Typeface:"Times New Roman"|Size:8|Bold:N|Italic:N|CharSet:0
|Font|Style:User5|Typeface:"Times New Roman"|Size:8|Bold:N|Italic:N|CharSet:0
|Font|Style:User6|Typeface:"Times New Roman"|Size:8|Bold:N|Italic:N|CharSet:0
|PgMargins|Left:1.27|Top:1.27|Right:1.27|Bottom:1.27|Mirror:N
|AddStaff|Name:"Staff"|Group:"Standard"
|StaffProperties|EndingBar:Section Close|Visible:Y|BoundaryTop:12|BoundaryBottom:12|Lines:5|Color:Default
|StaffProperties|Muted:N|Volume:127|StereoPan:64|Device:0|Channel:1
|StaffInstrument|Name:"Violin"|Patch:40|Trans:0|DynVel:10,30,45,60,75,92,108,127
|PerformanceStyle|Style:Legato|Pos:0|Visibility:Never
|Clef|Type:Treble
|TimeSig|Signature:4/4
|Note|Dur:4th|Pos:-2
|Note|Dur:4th|Pos:-1
|Note|Dur:4th|Pos:0
|Note|Dur:4th|Pos:1
|Bar
|Note|Dur:4th|Pos:-2
|Note|Dur:4th|Pos:-1
|Note|Dur:4th|Pos:0
|Note|Dur:4th|Pos:1
|Bar|Style:MasterRepeatOpen
|Flow|Style:Segno|Pos:11|Wide:Y
|Note|Dur:4th|Pos:-2
|Note|Dur:4th|Pos:-1
|Note|Dur:4th|Pos:0
|Note|Dur:4th|Pos:1
|Bar
|Note|Dur:4th|Pos:-2
|Note|Dur:4th|Pos:-1
|Note|Dur:4th|Pos:0
|Note|Dur:4th|Pos:1
|Flow|Style:ToCoda|Pos:5|Wide:Y
|Bar
|Ending|Endings:1
|Note|Dur:4th|Pos:-2
|Note|Dur:4th|Pos:-1
|Note|Dur:4th|Pos:0
|Note|Dur:4th|Pos:1
|Bar|Style:MasterRepeatClose
|Ending|Endings:2
|Note|Dur:4th|Pos:-2
|Note|Dur:4th|Pos:-1
|Note|Dur:4th|Pos:0
|Note|Dur:4th|Pos:1
|Bar
|Note|Dur:4th|Pos:5
|Note|Dur:4th|Pos:6
|Note|Dur:4th|Pos:7
|Note|Dur:4th|Pos:8
|Bar
|Note|Dur:8th|Pos:-2|Opts:Stem=Up,Beam=First
|Note|Dur:8th|Pos:-1|Opts:Stem=Up,Beam=End
|Note|Dur:8th|Pos:0|Opts:Stem=Down,Beam=First
|Note|Dur:8th|Pos:1|Opts:Stem=Down,Beam=End
|Note|Dur:8th|Pos:-2|Opts:Stem=Up,Beam=First
|Note|Dur:8th|Pos:-1|Opts:Stem=Up,Beam=End
|Note|Dur:8th|Pos:0|Opts:Stem=Down,Beam=First
|Note|Dur:8th|Pos:1|Opts:Stem=Down,Beam=End
|Flow|Style:DSalCoda|Pos:8|Justify:Right|Placement:BestFitForward
|Bar|Style:Double
|Flow|Style:Coda|Pos:8|Wide:Y
|Chord|Dur:Whole|Pos:-1,1
|AddStaff|Name:"Staff-1"|Group:"Standard"
|StaffProperties|EndingBar:Section Close|Visible:Y|BoundaryTop:10|BoundaryBottom:22|Lines:5|Color:Default
|StaffProperties|Muted:N|Volume:127|StereoPan:64|Device:0|Channel:2
|StaffInstrument|Trans:0|DynVel:10,30,45,60,75,92,108,127
|Lyrics|Placement:Bottom|Align:Standard Rules|Offset:0
|Lyric1|Text:"verse one verse one verse one verse one verse one verse one verse one verse one verse one verse one\n"
|Lyric2|Text:"verse two verse two verse two verse two verse two verse two verse twoverse two verse two verse two verse two verse two verse two verse two\n"
|Lyric3|Text:"verse three verse three verse three verse three verse three verse three verse three verse three verse three verse three verse three verse three\n"
|Clef|Type:Treble
|TimeSig|Signature:4/4
|Rest|Dur:Whole
|Bar
|Rest|Dur:Half
|Rest|Dur:4th
|Rest|Dur:8th
|Note|Dur:8th|Pos:-2
|Bar|Style:MasterRepeatOpen
|Flow|Style:Segno|Pos:11|Wide:Y
|Note|Dur:8th|Pos:-1|Opts:Stem=Up,Beam=First
|Note|Dur:8th|Pos:0|Opts:Stem=Up,Beam=End
|Note|Dur:8th|Pos:1|Opts:Stem=Down,Beam=First
|Note|Dur:8th|Pos:2|Opts:Stem=Down,Beam=End
|Note|Dur:4th|Pos:3
|Note|Dur:4th|Pos:2
|Bar
|Note|Dur:8th|Pos:-1|Opts:Stem=Up,Beam=First
|Note|Dur:8th|Pos:0|Opts:Stem=Up,Beam=End
|Note|Dur:8th|Pos:1|Opts:Stem=Down,Beam=First
|Note|Dur:8th|Pos:2|Opts:Stem=Down,Beam=End
|Note|Dur:4th|Pos:3
|Note|Dur:4th|Pos:2
|Flow|Style:ToCoda|Pos:5|Wide:Y
|Bar
|Ending|Endings:1
|Note|Dur:8th|Pos:3|Opts:Stem=Down,Beam=First
|Note|Dur:8th|Pos:2|Opts:Stem=Down,Beam=End
|Note|Dur:8th|Pos:1|Opts:Stem=Down,Beam=First
|Note|Dur:8th|Pos:0|Opts:Stem=Down,Beam=End
|Note|Dur:4th|Pos:-1
|Note|Dur:4th|Pos:0
|Bar|Style:MasterRepeatClose
|Ending|Endings:2
|Note|Dur:8th|Pos:3|Opts:Stem=Down,Beam=First
|Note|Dur:8th|Pos:2|Opts:Stem=Down,Beam=End
|Note|Dur:8th|Pos:1|Opts:Stem=Down,Beam=First
|Note|Dur:8th|Pos:0|Opts:Stem=Down,Beam=End
|Note|Dur:Half|Pos:-1
|Bar
|Rest|Dur:Whole
|Bar
|Rest|Dur:Whole
|Flow|Style:DSalCoda|Pos:8|Justify:Right|Placement:BestFitForward
|Bar|Style:Double
|Flow|Style:Coda|Pos:8|Wide:Y
|Note|Dur:Whole|Pos:-1
!NoteWorthyComposer-End
31
General Discussion / Ties at a repeat, appear unresolved.
In the following snippet (treble clef, A major) within the first ending, the ties are resolved after a previous Master Repeat Open.  In the first bar of the 2nd ending, the ties carry over looking for a resolution.  Fortunately the same tied chord is at the end of the measure.

Is there any way to eliminate the unwanted "lens" in that measure?  TIA
Code: (nwc) [Select · Download]
!NoteWorthyComposerClip(2.751,Single)
|Chord|Dur:8th|Pos:n-2,0
|Chord|Dur:4th|Pos:-1,1
|Chord|Dur:8th|Pos:-4^,-1^
|Chord|Dur:Half|Pos:-4^,-1^
|Bar
|Chord|Dur:Half,Dotted|Pos:-4,-1
|Rest|Dur:8th
|Chord|Dur:8th|Pos:-1^,1^
|Bar|Style:MasterRepeatClose
|Chord|Dur:Half|Pos:-8^,-6^,-4^
|Chord|Dur:4th,Dotted|Pos:-8,-6,-4
|Chord|Dur:8th|Pos:-1^,1^
|Bar
|Chord|Dur:8th|Pos:-1,1
|Chord|Dur:4th|Pos:-1,1
|Chord|Dur:8th|Pos:0^,2^
|Chord|Dur:8th|Pos:0,2
|Chord|Dur:4th|Pos:0,2
|Chord|Dur:8th|Pos:n-2^,0^
|Bar
|Chord|Dur:8th|Pos:-2,0
!NoteWorthyComposerClip-End
32
User Tools / Force Stem Up for unstemmed middle line notes.
Code: [Select · Download]
/*
 doStem.js  by Warren Porter
                                  Stem Tool
 This tool will change all notes on the middle line where no stem direction is specified to stem up.

 This tool can operate on ONLY a selected part of a staff, or, if nothing has been selected, the entire staff.

 To install:
 1) Save this file with the name doStem.js on your computer and remember its location.
 2) Start NWC and press Alt/F8.  Pick new
 3) After choosing a name and group, browse for this file and click "Open".
 4) Insert "wscript " at the beginning of the command.
 5) Clip text should be selected and check no options.
 */

rc=0, errMsg="";

function doProcess(clip) {
var displ=0, upDispl=0;
var result = new Array();
var lines = clip.split("\r\n");
  for (i = 1; i < lines.length; i++) {           // Main processing loop
  if (lines[i].indexOf("Stem=") > 0)  // Already has stem direction specified
    continue;
  else {
    result = lines[i].match(/(\|Note.*Pos:)([n#bvx]?)0/) // 1. Note thru Pos 2. Accidental 3. Position 4. Shape 5. Ties 6. To end of line
if (result != null) {
  lines[i] += "|Opts:Stem=Up" }
   } }    // End main loop
  return lines;
}

var myLines;
  myLines=doProcess(WScript.StdIn.ReadAll()).join("\r\n");

if (rc == 0)
  WScript.StdOut.Write(myLines);
else
  WScript.StdErr.Write(errMsg);
WScript.quit(rc);
If you have to transpose after running this, run Audit Note Stems and then rerun it.
33
User Tools / Insert accumulated time after each bar line
Save the following with the name TimeText.js .  When installing a new user tool and doing the Browse to get this, add "wscript " (note trailing space) to the beginning of the line and the prompts on line 6 to the end of it.  Accept the defaults.

I wanted to give a warning when a Tempo Varience was found, but didn't find a way to do it.
Code: [Select · Download]
/* Time Through Current Bar by Warren Porter "TimeText.js"

   This script will insert the cumulative time at the beginning of each bar line.
   After downloading this file, when setting it up in NWC User Tools create this command line:

   wscript "'Browse can insert the path for you' \TimeText.js" <PROMPT:Run?:=|Yes|Undo> <PROMPT:BeginTime:=*00:00.0>

   The first parm will run the whole script ("Yes") or simply remove timings from a previous run ("Undo").
   Use the second parameter to specify a starting time for the song.
 */

var rc=0, errMsg="";
function getNoteLength(notelet) {  // Returns duration of note , whole = 768
var NoteLengths = { "16th":48, "32nd":24, "4th":192, "64th":12, "8th":96, "Half":384, "Whole":768 } ;

parts = notelet.split(",");
var  noteLength= -1;
noteLength = NoteLengths[parts[0]];
if (typeof(noteLength) == "undefined")
  return -1;

  for (var i = 1; i < parts.length; i++) {
    if (parts[i].substr(0,9) == "DblDotted") {
  noteLength = noteLength * 7 / 4; }
else
      if (parts[i].substr(0,6) == "Dotted") {
    noteLength = noteLength * 3 / 2; }
  else
    if (parts[i].substr(0,7) == "Triplet") {
      noteLength = noteLength * 2 / 3; } }
  return noteLength;
}
function tempoLength(notelet) {  // Returns duration of tempo
var NoteLengths = { "Eighth Dotted":144, "Eighth":96, "Quarter Dotted":288, "Quarter":192, "Half Dotted":576, "Half":384}
var noteLength = -1;
noteLength =NoteLengths[notelet];
if (typeof(noteLength) == "undefined")
  return -1;
return noteLength;  }

function calculate(clip) {
 
  var i, a, cumDur=0, durVal=0, durLen, min, sec, cumTime, wholeMeas=768, preTime=0, unDo=0, doWarn=1;
  var base=192;  //Default for tempo
  var beatletLength=0;  //Duration of "768th" note
  var result = new Array();
  var lines = new Array();
   var shell = new ActiveXObject("WScript.Shell");
    if (WScript.Arguments.length != 2) {
  errMsg = "I need two parms: Yes or Undo and initial time offset";
  rc=1;
return; }

  if (WScript.Arguments.Item(0) == "Undo")
  unDo=1;

  result = WScript.Arguments.Item(1).match(/(\d+):(\d+\.*\d*)/)
  if (result != null) {  // Read starting time
    min=parseInt(result[1]);
sec=parseFloat(result[2]);
preTime=min*60 + sec;}

  lines = clip.split("\r\n");
 
  for (i=0; i < lines.length; i++) {    //Main processing loop
 
result=lines[i].match(/\|Font:PageSmallText\|Pos:10\|Color:[36]/)
if (result != null)    // Remove earlier comments
  lines[i] = "#";
 
    if (unDo)
  continue;
 
if (lines[i].slice(0,15) == "|TempoVariance|") {  //Found tempo varience, give a warning
  if (doWarn) {
    shell.Popup("A Tempo Varience has been found, results are unpredictable");
    doWarn=0; } // Don't say it more than once.
      continue;   }
  
    if (lines[i].slice(0,5) == "|Flow") {
    errMsg="Repeats or flow changes not allowed";
rc=1;
return;}
 
if (lines[i].slice(0,7) == "|Tempo|") {  //Found tempo, look for base
  if (lines[i].substr(6,5) == "|Base") {
    result=lines[i].match(/Base:(.+)\|Tempo/)
base= tempoLength(result[1]); }
  else
    base = 192;
  result=lines[i].match(/(\|Tempo.*Tempo:)(\d+)/)
  a=parseInt(result[2]);
  beatletLength= 60 / (a * base);
      continue;   }  // End of Tempo code
 
    if (lines[i].slice(0,15) == "|Rest|Dur:Whole" && lines[i].indexOf(",") == -1) {
  cumDur += wholeMeas;   //Found whole rest but use duration of last time signature.
      continue;}
 
    result=lines[i].match(/Dur:([^\|]*)/);  // Looking for anything with duration not grace
if ((result != null) && (!/Grace/.test(lines[i]))) { // Has duration but is not grace.
  var durVal = result[1];
  var durLen = getNoteLength(durVal);
  cumDur += durLen;
      continue;   }
 
 
    result=lines[i].match(/Signature:(\d+)\/(\d+)/)
if (result != null)
  wholeMeas = 768 * result[1] / result[2];
 
result=lines[i].match(/\|RestMultiBar\|NumBars:(\d+)\|/)
if (result != null)
  cumDur += wholeMeas * result[1];
 
if (lines[i].slice(0,4) == "|Bar") { // Found a bar line
  if (beatletLength == 0) { // Shouldn't happen
    errMsg="Bar before Tempo indication, aborting";
rc=1;
return;}

  if (lines[i].search("Repeat") != -1) {
    errMsg="Repeats or flow changes not allowed";
rc=1;
return;}

  cumTime = preTime + cumDur * beatletLength;
      min = Math.floor(cumTime/60);
  sec = cumTime;
  sec -= min * 60;
  smin=min.toString()
  if (min < 10)
    smin = "0" + smin;
  sec =  Math.round(sec*1000)/1000;
  ssec = sec.toString();
  if (sec < 10)
    ssec = "0" + ssec;

  lines[i] += "\r\n|Text|Text:\"" + smin + ":" + ssec + "\"|Font:PageSmallText|Pos:10|Color:3" }

if (lines[i].slice(0,27) == "!NoteWorthyComposerClip-End") {
  cumTime = cumDur * beatletLength;
      min = Math.floor(cumTime/60);
  sec = cumTime;
  sec -= min * 60;
  smin=min.toString()
  if (min < 10)
    smin = "0" + smin;
  sec =  Math.round(sec*1000)/1000;
  ssec = sec.toString();
  if (sec < 10)
    ssec = "0" + ssec;

  lines[i] = "|Text|Text:\"" + smin + ":" + ssec + " " + cumDur + "\"\|Font:PageSmallText|Pos:10|Color:6\n" + lines[i];
  break;  }  // Don't do the end clip again
  } 
   rc = 0;
  return lines;
  }   // End main processing loop

var myLines=calculate(WScript.StdIn.ReadAll()).join("\r\n");
if (rc == 0)
  WScript.StdOut.Write(myLines);
else
  WScript.StdErr.Write(errMsg);
WScript.quit(rc);

Edited change:  Got a popup to warn of tempo variences.
34
General Discussion / Problem getting a page off the ground.
I have been working on TimeTxt.html to insert the minutes and seconds that have been played so far right after each barline.  This only works with songs with no tempo variences but, if you put a final bar line before the end, the last time doesn't agree with NWC displays while playing it.  After finding a tempo indication, it alerts the duration of each 768th note, on which all other durations are based.

Cntl/U displays the source code on many browsers.

TIA
35
General Discussion / Object plugins
Is there a primer for using object plugins?  How to install, when to use, how to change options, and (assuming someone knows lua), what steps are needed to modify or create a new one.

TIA
36
General Discussion / Loss of website
Comcast is shutting down all hobby websites including mine around Oct 10.  wporter211/realsite/nwc.htm If you regularly / occasionally use it, download the pages or scripts you need soon.  If you use a web page, when you download it change its name to .hta instead of .htm or .htlm.  The "avoidance" pages would be extremely difficult to turn into scripts most of the rest already have.

If you use anything on it, what is is?
37
General Discussion / Request for a grace note tool
In the attached snippet (711a), the grace notes take time from the quarter note in the 2nd beat, sounding like the measure in the middle staff (although the grace notes sound faster in the top staff), but what I would like is the bottom staff.

As an experiment I put the three measures on the same staff, exported to midi, and imported them back (711b).  The 16th grace notes had turned into 32nds. How does this work?

If anyone has or is working on a tool that can change the top staff to the bottom, please let me know before I try to tackle this.

TIA
38
User Tools / Tool to add (or undo) velocity and volume to a dynamic
When a note requires constant effort (moving bow, column of air) to produce, it's volume can change with a cresc., decres., or hairpins, but velocity and volume must be specified on each dynamic.  Save the following under the name "dynamic.js".  Installation instructions are shown on the first four lines.
Code: [Select · Download]
/* Dynamic Velocity by Warren Porter "dynamic.js"
   After downloading this file, when setting it up in NWC User Tools create this command line:
  
   wscript "'Browse can insert the path for you' \dynamic.js"  <PROMPT:DYN?:=|Yes|Undo> <PROMPT:Dynamics:=*127,108,92,75,60,45,30,10>
    */
 //  Substitutions: Wscript.Arguments <-> parms
 //                 Item(n)            <-> [n]
 
var rc=0, errMsg="";
function calculate(clip) {
  var dyn_table = [ "fff", "ff", "f", "mf", "mp", "p", "pp", "ppp" ]
  var dyn_vol1 = new Array();
  var i, j, OutText = "", relPos=0, absPos=0, goSwitch=false, dynSuffix;
  var lines = new Array(), result = new Array();
  // lines = clip.split("\n");  // As webpage
   lines = clip.split("\r\n");
  if (WScript.Arguments.length != 2) {
    errMsg="Needs option to override velocity or undo it as well as default dynamic levels";
rc=1;
return lines; }
  if (WScript.Arguments.Item(0) == "Undo") {
   for (j = 0; j < lines.length; j++) {
    if (lines[j].slice(1,8) == "Dynamic")
  lines[j]=lines[j].replace(/\|Opts[^\|]*\|/,"|"); }
   return lines;
   }
  // First, break down the 2nd parm
  dyn_vol1 = WScript.Arguments.Item(1).split(",");
  if (dyn_vol1.length != 8 ) {
    errMsg="I need eight dynamic levels, the 2nd prompt was " + WScript.Arguments.Item(1);
rc=1;
return lines; }

  for (j = 0; j < lines.length; j++) { // Main processing loop
    var str = lines[j];
    result = str.match(/\|Dynamic\|Style:(mf|mp|[fp]{1,3})\|Pos:/)
if (result == null)
  continue;

    switch (result[1]) {
  case "fff":
    i=0; break;
  case "ff":
    i=1; break;
  case "f":
    i=2; break;
  case "mf":
    i=3; break;
  case "mp":
    i=4; break;
  case "ppp":
    i=7; break;
  case "pp":
    i=6; break;
  case "p":
    i=5; break;
  default: errMsg="switch failed on " + result[1]; rc=1; return lines;  }
    var newstr="|Dynamic|Style:" + dyn_table[i] + "|Opts:Velocity=127,Volume=" + dyn_vol1[i] + "|Pos:"
    str = str.replace(result[0],newstr);
lines[j] = str;
}  // end of lines[j] loop;
  return lines;
}

var myLines=calculate(WScript.StdIn.ReadAll()).join("\r\n");
if (rc == 0)
  WScript.StdOut.Write(myLines);
else
  WScript.StdErr.Write(errMsg);
WScript.quit(rc);
39
General Discussion / Grace notes with duration
I had started to create a new tool which would add hidden rests after selected grace notes, but hit a brick wall when I saw grace notes can't be beamed or tripletized when a rest comes between them.  Any way around this?  Any plans to make real durations an optional attribute of notes and chords?  Perhaps a new type of notes to be used as cues?

This was referenced in a user tip.
40
User Tools / Rubato
I have created a tool for adding rubato to a song in NWC.  Between the first two tempo markings, the base tempo will gradually increase or decrease in a linear fashion while being modified by a random function.  If there is no second tempo, the base tempo will be constant.  The user is prompted for the amount of variation, from petty theft to grand larceny.

After copying this to your PC, open NWC and install a new tool.  Use Browse to fill in the path to the file while adding "WScript " (note trailing space) to the beginning of the line and
" <PROMPT:Enter percentage:=*10> <PROMPT:Smooth Transition?:=|Y|N>" to the end.

Please save the file changing the end from .js.txt to .js and the above instructions should work.

Changed attachment.  Changed instructions for prompt.

Replaced attachment (6/11/14) for better random function: Gaussian distribution (bell curve), mean=0, std. deviation=1.
41
General Discussion / Trailing slurred grace notes
With bowed instruments, slurs are usually used to indicate notes played with the bow moving in the same direction.  Near the end of a phrase there may be a grace note or two trailing an ordinary note, but the bow won't change direction until the last note.  Is there any workaround to produce the image on the attachment?  I can't stop the slur.
42
General Discussion / Indenting the staff.
This may be related to an earlier thread.  Usually the first staff on a part for one instrument will be indented without supplying the staff name for a new section or new movement.  If more than one staff is being displayed in a system, nothing is done to where the staff starts even though the staff walks over any bracket or brace.  Instead of doing a staff gap, displaying the staff names would also do the "indent", but that wasn't done to any except for the first movement in the collection I'm currently going through (see the scan0001.pdf).

Try doing a print preview on the attached NWC file.

TIA

43
General Discussion / Printing on big paper
I would like to create a PDF with the dimensions of 13" by 10"  (33cm x 25cm).  When doing a print setup from the NWC side, what device/option do I choose?

TIA
44
User Tools / Resting Staff
This tool should come in handy when you decide, after many time signature, key signature, and/or clef changes that it will be necessary to layer the staff you are working on.
  • Create your new staff.
  • Copy the original staff to the new one.
  • Run this tool: "Resting Staff".  The new staff will have all notes, chords, and rests replaced with whole notes rests! except for pickups.
  • Replace appropriate measures when necessary to layer parts from the original staff.
  • Be sure the instrument and dynamic level match the original staff.
  • Run the MMR tool with the "LayerHide" option.
This tool also helps edits bar lines.  Any measure with too many or few beats will be replaced with rests with the same duration instead of a whole rest.

To install, save this code on your computer with a name of restStaff.js and note its location.
While NWC has a file opened, enter Alt/F8 for User Tools.  Select New and choose a group and a name.
Click Browse and find the file you just saved and click Open.
Insert "wscript " (note trailing space) in the beginning of the Command line.
Click OK and it is ready to run.  There are no prompts.

This will change your staff to rests.  Before using, save your file and duplicate the staff on which you will be using it.
Code: [Select · Download]
/* Notes to Rests by Warren Porter "restStaff.js"
   After downloading this file, when setting it up in NWC User Tools create this command line:

   wscript "'Browse can insert the path for you' \restStaff.js"

   This can help create a new staff when one is needed for layering.  First, copy an entire staff to the clipboard, create a new staff,
   then cut the clipboard to the new staff.  Run this command on that new staff.  Clefs, time signatures, and key signatures will be
   left alone on the new staff, but all notes, chords, and restchords will be replaced by rests.  Bars with "full measures" (the norm,
   it has as many beats as the time signature dictates) will be replaced with whole rests, a measure with more or fewer (like a pickup)
   will be replaced with rests of the same durations (and order if necessary) or the original notes, rests, chords, or restchords.

   The new staff may then be used for layered notes for the original staff.  It can be run through the MMR tool with the "LayerHide"
   option so unneeded parts won't display.
  
   This is not suited to creating a "tempo" or "conductor" staff.  To create a tempo staff which could be layered into all other parts
   to print parts, the clef or keys should not be copied while tempos or tempo variences should be.
 */

var rc=0, errMsg=""
function getNoteLength(notelet) {  // Returns duration of note , whole = 768
var NoteLengths = { "16th":48, "32nd":24, "4th":192, "64th":12, "8th":96, "Half":384, "Whole":768 }
parts = notelet.split(",");
var  noteLength= -1;
noteLength = NoteLengths[parts[0]];
var noteLength = ( NoteLengths[parts[0]] === undefined ) ? -1 : NoteLengths[parts[0]];
  if (noteLength == -1)
    return -1;

  for (var i = 1; i < parts.length; i++) {
    if (parts[i].substr(0,9) == "DblDotted") {
  noteLength = noteLength * 7 / 4; }
else
      if (parts[i].substr(0,6) == "Dotted") {
    noteLength = noteLength * 3 / 2; }
  else
    if (parts[i].substr(0,7) == "Triplet") {
      noteLength = noteLength * 2 / 3; } }
  return noteLength;
}
function calculate(clip) {
  var i, j=0, dsi;
  var lines = new Array(), result = new Array(), nlines = new Array, mt=0, measureTab = new Array, beatletCount=0, targetMeasure = 768;
  var thisDur, thisNote, durSplit;
  lines = clip.split("\r\n");
  for (i=0; i < lines.length; i++) {
if (lines[i].slice(1,5) == "Text" || lines[i].slice(1,14) == "TempoVariance")
  continue;
    if (lines[i].slice(1,5) == "Fake" || lines[i].slice(1,8) == "Context" ) {  // For these items, pass them thru and ignore them.
  nlines[j++] = lines[i]; continue; }
if (lines[i].slice(1,8) == "TimeSig") {
  if (beatletCount == targetMeasure)  // Measure exactly full
    nlines[j++] = "|Rest|Dur:Whole|Visibility:Never";  // Insert whole rest
  else {
    for (mt = 0; mt < measureTab.length; mt++)
  nlines[j++] = "|Rest|Dur:" + measureTab[mt] + "|Visibility:Never";}
  beatletCount = 0, measureTab.length = 0; mt=0;
  result = lines[i].match(/ture:(\d+)\/(\d+)/);  // Read the time signature
  if (result == null)  //In case it is C or cut time
    targetMeasure = 768;
  else
    targetMeasure = 768 * result[1] / result[2];    // Calculate length of measure  
  nlines[j++] = lines[i]; continue; }  
if (/Grace/.test(lines[i]))
  continue;
result = lines[i].match(/Dur:([^\|\r\n]+)/)   // Looking for anything with a duration
if (result != null) {  // Duration loop
  thisDur = result[1];
  thisNote = getNoteLength(thisDur);
  if (thisNote == -1) {
    errMsg += "Invalid duration of " + lines[i] + "\r\n";
rc=1;
continue; }
  durSplit = thisDur.split(",");
  for (dsi=1; dsi < durSplit.length; dsi++)
    if (!(durSplit[dsi].substr(0,9) == "DblDotted" || durSplit[dsi].substr(0,6) == "Dotted" || durSplit[dsi].substr(0,7) == "Triplet")) {
  durSplit.length = dsi; break; }
  measureTab[mt++] = durSplit.join(",");
  if (lines[i].slice(1,15) == "Rest|Dur:Whole")  //So existing whole rest in , e.g., 3/4 time won't be treated as having 4 beats.
    thisNote = targetMeasure;
  beatletCount += thisNote;
  continue; }   // End duration loop
if (lines[i].slice(1,4) == "Bar" || lines[i].slice(1,5) == "Flow" || lines[i].slice(1,7) == "Ending"  || lines[i].slice(0,1) == "!"||
      lines[i].slice(1,13) == "RestMultiBar" || lines[i].slice(1,9) == "Boundary" || lines[i].slice(1,11) == "Instrument" ||
  lines[i].slice(1,4) == "MPC" || lines[i].slice(1,5) == "Clef" || lines[i].slice(1,4) == "Key" ) {  //Bar loop, flow, & spec. endings
  if (beatletCount == targetMeasure)  // Measure exactly full
    nlines[j++] = "|Rest|Dur:Whole|Visibility:Never";  // Insert whole rest
  else {
    for (mt = 0; mt < measureTab.length; mt++)
  nlines[j++] = "|Rest|Dur:" + measureTab[mt] + "|Visibility:Never";}
  beatletCount = 0, measureTab.length = 0; mt=0;  // Get set up for next measure
  if (lines[i].slice(1,6) != "Tempo")
    nlines[j++] = lines[i]; }  //End bar loop
  }  //End main processing loop
  return nlines;
}

var myLines=calculate(WScript.StdIn.ReadAll()).join("\r\n");
if (rc == 0)
  WScript.StdOut.Write(myLines);
else
  WScript.StdErr.Write(errMsg);
WScript.quit(rc);

Modified to include special endings and flow control the same as bar lines.
Allow whole rest in non 4/4 (2/2) time to assume the value of time signature then in effect.
Hides generated rests.  Will not copy tempos or tempo variences.
Passes through MMRs, Boundarys, MPC, and Instrument changes.
45
User Tools / Multi Measure Rest tool
The following tool should provide a convenient way to convert consecutive measures of whole rests into MMR's, or convert MMRs back to whole rests.  Installation instructions are on the bottom.  First save the following with the name mmr.js and remember its location:
Code: [Select · Download]
/*
 mmr.js  by Warren Porter

 <PROMPT:MMR?:=|Yes|Undo> <PROMPT:Options:=|HideAll|ShowAll|ShowBar|ShowRst|LayerHide>
                                  Multi Measure Rest Tool
 This tool gives the user the ability to convert consecutive measures of whole rests into Multi-Measure Rests.  When hidden,
 the user can choose to show bars and rests, bars only, rests only, or neither.  If a "conductor" or "tempo" staff is being
 layered into a part to be printed, the "LayerHide" option will prevent any MMR on that part from being displayed.  Boundary
 collapse and cancel collapse commands are created around the multi measure rests.

 Changes made can be backed out with the "Undo" prompt.  All options on the 2nd prompt are ignored.  The above boundary commands
 are removed and MMRs are replaced by the approprate number of whole rests separated by bar lines.

 This tool can operate on ONLY a selected part of a staff, or, if nothing has been selected, the entire staff.
 */

rc=0, errMsg="";

function doProcess(clip) {
  var result=new Array(), nlines=new Array(), ii=0, lastBar=-1,cntRest=0,lastRest=0;
  var mmrOption = "|PrintOnce:Y";
  if (WScript.Arguments.Item(1) == "ShowAll")
    mmrOption += "|WhenHidden:ShowBars,ShowRests";
  else
if (WScript.Arguments.Item(1) == "ShowBar")
  mmrOption += "|WhenHidden:ShowBars";
else
  if (WScript.Arguments.Item(1) == "ShowRst")
    mmrOption += "|WhenHidden:ShowRests";
  else
    if (WScript.Arguments.Item(1) == "LayerHide")
          mmrOption = "|PrintOnce:N|Visibility:Never"; // Used for hiding tempo or conductor stave.

  lines = clip.split("\r\n"); // lines === existing lines; nlines === lines to be created

  for (var i=0; i < lines.length; i++) {  // Main processing loop
    switch (cntRest) {
  case 0 :
    if (lines[i].slice(0,15) == "|Rest|Dur:Whole") {  //Found first rest
  cntRest++; lastRest = i; }
else {
  nlines[ii++] = lines[i]; } // Didn't find a rest and have no backlog, copy line to OP array.
break;
  case 1 :  // Have found exactly one whole rest
        if (lines[i].slice(0,15) == "|Rest|Dur:Whole") {
          cntRest++; lastBar = 0; }
        else
          if ((lines[i].slice(0,4) == "|Bar") && (lines[i].slice(4,11) != "|Style:")) {
            lastBar = i; }
          else {  //  Found whole rest not followed by bar or another rest
            if (lastRest) {
              for ( ; lastRest <= i; lastRest++) {
                 nlines[ii++] = lines[lastRest] }
            cntRest=0,lastBar=0; } }
        break;
      default: // cntRest is 2 or more.
        if (lines[i].slice(0,15) == "|Rest|Dur:Whole") {
          cntRest++; lastBar = 0; }
        else
          if ((lines[i].slice(0,4) == "|Bar") && (lines[i].slice(4,11) != "|Style:")) {
            lastBar = i; }
          else {  //  Found whole rest not followed by bar or another rest, must create MMR
            nlines[ii++] = "|Boundary|Style:Collapse";
            nlines[ii++] = "|RestMultiBar|NumBars:" + cntRest + mmrOption;
            if (lines[i].slice(0,27) != "!NoteWorthyComposerClip-End" || lastBar) {
              nlines[ii++] = "|Boundary|Style:EndCollapse"; }
cntRest = 0;
            if (lastBar)   // If MMR was followed by a barline and something else
              nlines[ii++] = lines[lastBar];  // first move the barline over
            lastBar = 0;
            nlines[ii++] = lines[i] //  Move the non-rest non-bar over to OP buffer.
            }
        }   //End of switch
  }           //End main processing loop
  /* Next loop will place the Boundary Collapse BEFORE a bar line and the Cancel Collapse AFTER a bar line. This will stop empty
     bars from being displayed when a part begins or ends on a complete system.  The loop after that will remove EndCollapse and
Collapse when they are next to each other.
   */

  for (i=1; (i+1) < nlines.length; i++) {  // Start fixit loop.
    if ((nlines[i].slice(0,4) == "|Bar") && (nlines[i+1].slice(0,24) == "|Boundary|Style:Collapse")) {
  var tempi = nlines[i];
  nlines[i] = nlines[i+1];
  nlines[++i] = tempi; }
else
  if ((nlines[i].slice(0,27) == "|Boundary|Style:EndCollapse") && (nlines[i+1].slice(0,4) == "|Bar")) {
    tempi = nlines[i];
    nlines[i] = nlines[i+1];
    nlines[++i] = tempi; }
  }    //End fixup loop

  for (i=1; (i+1) < nlines.length; i++) {
    if ((nlines[i].slice(0,27) == "|Boundary|Style:EndCollapse") && (nlines[i+1].slice(0,24) == "|Boundary|Style:Collapse")) {
  nlines[i] = "#";  //Turn both lines into a comment
  nlines[++i] = "#"; }
else
  if (WScript.Arguments.Item(1) == "LayerHide" && nlines[i].slice(0,5) =="|Rest" && nlines[i].indexOf("|Visibility:Never") == -1)
    nlines[i]+= "|Visibility:Never";
  }

  return nlines;
}
/*
!NoteWorthyComposerClip(2.51,Single)
|Rest|Dur:Half
|Tempo|Tempo:70|Pos:10
|Rest|Dur:4th|Visibility:Never
|Tempo|Tempo:67|Pos:10
|Rest|Dur:4th
|Bar|Visibility:Never
|Rest|Dur:Whole|Visibility:Never
!NoteWorthyComposerClip-End

 */

function doUndo(clip) {
  var result=new Array(), nlines=new Array(), ii=0, lastRest=0,cntRest=0;
  var restLit = "|Rest|Dur:Whole", barLit = "|Bar";
  lines = clip.split("\r\n"); // lines === existing lines; nlines === lines to be created

  for (var i=0; i < lines.length; i++) {  // Main processing loop
    if (lines[i].match(/Boundary.*Collapse/) != null)
      continue;
    result = lines[i].match(/(RestMultiBar\|NumBars:)(\d+)(\|PrintOnce)/)
    if (result == null) {
      nlines[ii++] = lines[i]; }
    else {
      lastRest = Number(result[2])
      for (cntRest=0; cntRest < lastRest; cntRest++) {
        nlines[ii++] = restLit;
        if ((cntRest + 1) < lastRest)
          nlines[ii++] = barLit;
      }
    }
  }           //End main processing loop
   if (WScript.Arguments.Item(1) == "LayerHide") {
     for (i = 0; i < nlines.length; i++)
   if (result = nlines[i].match(/Rest.*Never/))
     nlines[i] = nlines[i].replace("|Visibility:Never","") }
  return nlines;
}
var myLines;
  if (WScript.Arguments.length != 2) {
    errMsg="NO Prompt read.";
rc=1; }
  else {
    if (WScript.Arguments.Item(0).slice(0,4) == "Undo")
  myLines=doUndo(WScript.StdIn.ReadAll()).join("\r\n");
else
  myLines=doProcess(WScript.StdIn.ReadAll()).join("\r\n"); }

if (rc == 0)
  WScript.StdOut.Write(myLines);
else
  WScript.StdErr.Write(errMsg);
WScript.quit(rc);

  • Open a file with NWC and enter Alt/F8.
  • Choose a group and give it a name "Multi Measure Rests".
  • In the Command line, hit Browse and find the file.
  • At the beginning of the command line insert "wscript " (include trailing space).
  • At the end of the command line, append the prompt below.
  • The Input Type is Clip Text.
  • Under "Options", leave all boxes unchecked.
  • Click OK.  It is ready to run.

Paste this prompt (include leading space) " <PROMPT:MMR?:=|Yes|Undo> <PROMPT:Options:=|HideAll|ShowAll|ShowBar|ShowRst|LayerHide>" at the end of the command line.

Edit 13-01-28: Corrected Options.
Edit 14-06-19: Replace script.
Edit 17-11-08: Replace script (bug fix)
46
User Tools / Dynamic Placement
This tool will allow you to move all or selected dynamics up or down by the amount you specify or place these dynamics at a specific position above, on, or below the staff.  Installation instructions are in comments.  An argument of +3 or -4 would move dynamics up or down while =-7 would put all dynamics below the staff.

This could be adapted to move other objects such as pedal commands.  Please note the first eight lines of this code:
Code: [Select · Download]
/* Dynamic Placement by Warren Porter "dynplace.js"
   After downloading this file, when setting it up in NWC User Tools create this command line:

   wscript "'Browse can insert the path for you' \dynplace.js" <PROMPT:Enter equal OR +- dd:=*sdd> <PROMPT:Justify Right?:=|N|Y> <PROMPT:Hairpins?:=|Move|Ignore>

   A parm of =10 would put ALL dynamic markings above the staff while =-7 would put them just below the staff.
   Parms of +3 or -2 would raise or lower all dynamic markings by the specified number of positions.
 */
rc=0, errMsg="";
function calculate(clip) {
  var i, OutText = "", relPos=0, absPos=0, goSwitch, dynPrefix, dynPos, dynSuffix;
  var lines = new Array(), result = new Array();
  if (WScript.Arguments.length != 3) {
    errMsg="NO Prompt read. This needs a prompt \"=[-]d[d]\" to place dynamics at a specific position or \"[+-]n[n]\" to move them up or down";
rc=1;
return lines; }
  errMsg=WScript.Arguments.Item(0) + "\r\n";
  result = WScript.Arguments.Item(0).match(/=(-?\d*)/);
  if (result)
    absPos=result[1];  //Absolute position specified
  else {
    result = WScript.Arguments.Item(0).match(/([-+]\d*)\D?/);
if (result)
  relPos = Number(result[1]);  // Relative position
else {  // Neither match worked, abort
      errMsg+="Invalid prompt. This needs a prompt \"=[-]d[d]\" to place dynamics at a specific position or \"[+-]n[n]\" to move them up or down";
  rc=1;
  return lines; } }
  var jRight = (WScript.Arguments.Item(1) == "Y")? true : false;
  var hairPins = (WScript.Arguments.Item(2) == "Ignore")? true : false;
  lines = clip.split("\r\n");
  for (i=0; i < lines.length; i++) { // Main processing loop
    result=lines[i].match(/(\|Dynamic\|Style.*Pos:)(-?\d*)(.*)/) // Looking for Dynamic, it's position, and the rest of the line
if (result) {  //Found dynamic
  goSwitch = true;  //Setting up look ahead loop
  if (hairPins) {
    for (var ii=i+1; ii < lines.length; ii++) {
  if (lines[ii].slice(0,5) == "|Text") continue;  //Ignore text lines
      if (lines[ii].slice(0,8) == "|Dynamic")  break;   //Found another dynamic or dynamic variance, get out of loop.
  if (/Crescendo|Diminuendo/.test(lines[ii])) { //Found hairpins before another dynamic, don't mess with it.
    goSwitch = false; break; } } // End lookahead loop
  }  // End if hairPins
  if (goSwitch) {
    dynPrefix = result[1];
    dynPos = Number(result[2]);
dynSuffix = result[3];
if (jRight) {
  if (dynSuffix == "")
    dynSuffix = "|Wide:N|Justify:Right";
  else {
   if (!/Justify:Right/.test(dynSuffix))
     if (/Justify:/.test(dynSuffix)) {
           dynSuffix = dynSuffix.replace("Justify:Left","Justify:Right");
           dynSuffix = dynSuffix.replace("Justify:Center","Justify:Right"); }
             else
               dynSuffix = "|Justify:Right" + dynSuffix; } }
    else
  dynSuffix = result[3];
    if (relPos != 0)
      {dynPos += relPos;}
    else
      {dynPos = absPos;}
    lines[i] = dynPrefix + dynPos + dynSuffix; }
}  // End dynamic loop
  }  //End main processing loop
  return lines;
}
var myLines=calculate(WScript.StdIn.ReadAll()).join("\r\n");
if (rc == 0)
  WScript.StdOut.Write(myLines);
else
  WScript.StdErr.Write(errMsg);
WScript.quit(rc);
47
User Tools / Fake and Context lines
I was experimenting with a copy of Rick's stats.js and noted two new objects that weren't found when a whole staff was copied to the clipboard.  On it's staff via the F2 key, the instrument (acoustic guitar) had a -12 specified for transposition.
Code: [Select · Download]
/*
NWC2 User Tool, Ver 1.0 - Rick G.  Warren's test version
JScript version of nwswStatisticsReport.php
&Command: WScript Scripts\Stats.js
*/

var i, mark = new Date(), s;
/*
objArgs = WScript.Arguments
WScript.Echo("Argument count = " + WScript.Arguments.Count());
for (i=0; i<objArgs.length; i++)
{
    WScript.Echo(objArgs(i))
}
 */
// convert notation clip text to an array of lines
var stdin = WScript.StdIn.ReadAll().split("\r\n");
// init these so they will always report
var d = {"Total Items":0, "Clef":0, "Key":0, "TimeSig":0, "Bar":0, "Note":0, "Chord":0};

// count objects. non-objects are counted as 'undefined'

for (i in stdin){ // i = array index (integer)
s = stdin[i].split("|")[1]; // objType or undefined
if ((s == "Fake") || (s == "Context")) WScript.echo(i + " " + stdin[i]);  // new line
d[s] = (0 | d[s]) + 1; // increment, create keys as needed
}
delete d.undefined; s = ""; // cleanup
for (i in d) d["Total Items"] += d[i];
for (i in d) s += ("    " + d[i] + " ").slice(-6) + i + "\n";

// report to STDOUT, elapsed time to STDERR
WScript.StdOut.Write("Statistics Report:\n\n" + s);
WScript.StdErr.Write("The STDOUT file contains the report.\n" +
  ((new Date() - mark) / 1000).toFixed(2) + " seconds\n");
WScript.Quit(99); // show STDOUT page to user
Does anyone have any insight to these lines (they occurred just after the header) or others?  The Fake line went away if there was no transposition.
48
Tips & Tricks / Avoiding note & accidental collisions in layered staves.
This webpage has two concurrent windows to handle the upper and lower staves of layered music and create extra notespace and/or accidental space when notes or accidentals would otherwise collide.  It handles notes only (no chords) and stem direction must be specified on all notes.  It can handle crossovers.


This page must be up at the same time you have a NWC file open since data are moved to and from the textareas on the webpage through cuts and pastes via the windows clipboard.  The stem up note will get extra space and, if both notes have accidentals, the stem up note will get the accidental space (change from non-crossovers).

It is a little easier to cut the lower staff to the lower window first.  After you cut the upper staff to the upper window and Submit, copy the pre-selected upper window, Alt/Tab to get back to NWC, and your cursor will be waiting where you left it and you can paste the clipboard back.  Now you will have to go back to the webpage to select and copy the lower staff.

It can now look at conflicting notes of different durations.

The attachment from the first message of the following thread: NWC Newbie Presents... is a way to test this webpage. At measures 14 and 31 the lead and tenor notes overlap while there are several places where the bass and baritone both have accidentals and are within a 6th of each other.

If you may need to use this when you don't have internet access, just do a Save As from your browser.  Run from your PC it has an unlabeled checkbox which can put test data in both textareas.

Created as a response to the Feature / "bug fix" requests thread.
49
General Discussion / Problems with Air
There is an intermittant problem in that when the first repeat happens, NWC doesn't show the first measure until it is nearly over.  The other question is the piano in measure 8.  The p in front of the E is speared by the crescendo on that note.  Is there any way around that short of inserting spacers whenever it happens?  This is a work in progress.

TIA
50
General Discussion / signa congruentiae
I saw this message in another forum, anyone ever heard of it?  Is it in a font we have?

Quote
I'm transcribing some Tudor music and, in the original, there are some
"squiggle-like signs" that I think are called signa congruentiae. They seem to
indicate points where all the parts come together.

Just wondering whether anyone has ever encoded these signs in abc. They look a
bit like a mirror image of a question mark, or a distorted S. For the moment,
I'm just annotating an "S" above the stave, but it would be nice to use
something more authentic.

The original message is here.