Skip to main content


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 - Bart

User Tools / USERTOOL: show_all_note_names.lua
You probably all know the usertool "show note names" which can be found in the .Automatic group and was delivered by Noteworthy self.

I have made an extension of this tool. It does not only show the note names in the current staff, but it shows all the sounding note names in all staves. An additional staff with rests and note names in the Lyrics is added at the end of the score where up to 8 sounding note names can be displayed.

I also added information about the fact that an instrument can sound lower or higher then the displayed notes (> when it sounds higher, < when it sounds lower). A trumpet in B flat will produce a Bb when a C is played.  "< C" will be shown.

For composing reasons, I finally added for each chord if the notes in a chord are part of an octave or a fifth (upper case for the bottom octave/fifth, lower case for the upper octave/fifth). This information could be helpful when checking for unwanted parallel fifths and octaves, since these sometimes unwanted parallels can only appear when these intervals are present.

To undo: just delete the (last) staff with the chord information.

A few remarks:
* triplets are converted into non-triplet duration notations and may therefore be slightly out-of-sync - but that is automatically corrected in the following chords.
* if staves have different time signatures, bar lines don't always appear at the same time. A bar line is added in the new chord names staff whenever a bar is present in one or more "normal" staves.
* this tool doesn't take care of scores where measures are added in between (but skipped) to cope with different verse texts, because it ignores master and local repeats. For this kind of scores the tool  will produce a useless chord name staff!
* this version of the tool treats drum staves as normal staves, which may also show useless and confusing information!

User Tools / Usertool : CHANGE_TEMPO
Did you ever want to listen to your NWC-file in the composer, but with another tempo? That is easy, isn't it? Just add a tempo object at the beginning of the file - or change the tempo in the - already present - tempo object!
Until ... all of a sudden, in measure 216 or so, your speed changes are gone just because another tempo object is present at that spot.

This little tool overcomes this issue. It just scans the whole file for tempo objects (also the hidden staves if available) and modifies the value in all tempo objects with a scaled value (in percent).

You will get feedback of the number of tempo changes that were made. Modifications are also made in hidden staves.

Be aware that, before the first tempo object appears in your score, a default tempo (quarter = 120) is used. This default tempo cannot be changed with this tool. So, when you want to speed up or slow down these files, first add a tempo object with default tempo (quarter = 120) manually at the beginning of a staff.


download the lua-file to a folder of choice
ALT+F8 (Tools - User Tools)
GROUP ==> choose a name for the group (an existing or new one)
NAME ==> choose a name for the tool (for instance CHANGE_TEMPO)
COMMAND ==> Browse to the downloaded lua file
Check "Returns File Text"  (Radio Button File Text is automatically selected)
Check "Prompts for user input"


ALT+F8 (Tools - User Tools)
GROUP ==> Select group in which you have put the tool
AVAILABLE COMMANDS ==> Select the name that you gave to this tool (for instance CHANGE_TEMPO)
Fill in the percentage for the tempo modifier

User Tools / (un)mute extreme notes
I created two Staff User Tools to (un)mute extreme notes - or chords with extreme notes - in the active staff.

A parameter (default = 10) is used to define which notes/chords may be changed : only objects  are affected when they have notes N or more positions away from the middle staff line.

With N = 0 all notes/chords can be muted or unmuted in the active staff.

To define the usertools in NWC, you first have to create references in NWC following these instructions:
  • copy the lua files in a folder on your own computer and memorize the location
  • in NoteWorthyComposer, with a score open, go to menu Tools \ User Tools
  • click on the NEW button
  • Fill out the information as in the example in the attached image: user_tool_description.png
  • Group and Name can be chosen freely
  • Command should point to the lua-file (memorized location)
  • Be sure to select File Text as Input Type
  • Be sure to select Returns File Text as Option

To Run a usertool (when already defined in NWC):
  • in NoteWorthyComposer, with a score open, go to menu Tools \ User Tools
  • navigate to the usertool by selecting the correct item in Group and Available Commands
  • click on the RUN button
  • change or use the default value (N) (see attached file user_prompt.png)
  • click OK
  • Since the unmute script can undo the mute script and vice versa, the "Save Recommendation" may be denied


General Discussion / Little gem : AutoHotKey
Using two screens, the key combination CTRL+F8 that is defined as "repeat Last User Tool" doesn't work for me since Windows intercepts my command and manipulates my screen settings.
But, I found a useful little tool that let me assign a specific key to a sequence of keystrokes: AutoHotKey (

After installation of the AutoHotKey program, create a little text based script, right click on it and choose "run script" (or double click on it if it has the .ahk extension, because then running is the default action). As soon as you touch the hotkey, your bunch of keystrokes is executed.

This little script defines function key F12 as my "repeat Last User Tool":

Code: [Select · Download]
#NoEnv  ; Recommended for performance and compatibility with future AutoHotkey releases.
; #Warn  ; Enable warnings to assist with detecting common errors.
SendMode Input  ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir%  ; Ensures a consistent starting directory.

if WinExist("ahk_exe NWC2.exe")
   WinActivate, ahk_exe NWC2.exe

 send, {alt down}t{alt up}e

Following the information in the AutoHotKey documentation, even combination of different key definitions (also for different programs) is possible in one ahk.script.

User Tools / Sibling : example of a usertool scripted in LUA
"This tool mutes the active staff and adds 2 copies with all its relevant information into 2 new sibling staves with two different instrument patches."    -- added as suggested --

For the people who want to learn LUA as a scripting language for Noteworthy Composer, I can distribute a LUA script I made myself a few months ago. I didn't publish it because it is all hard coded and therefore only usable for people who can make their own customization. I created this tool to speed up things, and didn't want it to slow down with user input boxes, etc.
Therefore it is not usable as a universal user tool. If you want to "tune" the tool, you will have to hack the code.

I must admit that it took a lot of time. There are only a few examples in the documentation and it was - for me - not the most comprehensive source of information. For creating my script, I combined the LUA documentation ( with the examples I found in the cloud. But most of my knowledge I got from examples that Rick G and Opagust posted in the forum. Without their work I wouldn't be able to create this script.

As far as I understand,  LUA is the preferred scripting language for user tools.  I am not aware if it is also a good choice for user objects.

There are different modes for LUA scripts and the mode should correspond with the option how a user tool should run. In this example FileText mode is used. A check for this mode is made with the method "nwcut.getprop('Mode')" in the first line of the main processing module.

LUA is a nested table oriented tool and has more flexibility in (nested) table manipulation as in text strings. These nested tables (also defined as objects) can be mapped on the structure of NWC files.
If "nwc.setlevel(2)" is specified, nwcobjects are interpreted as objects (or nested tables). You can force your script with a lower level (1) in text mode but it turned out - for me - that this is less flexible.

The structure of my script is as follows:

(1) check mode and returnmode
(2) define an object (or empty nested table) "mt" where the whole existing nwc-file will be staged and which can be printed out at the end of the script.
(3) loop over the nwc-file and collect interesting properties in variables, modify the properties - if desired -, and stage the result (original or modified) in "mt"
(3.1) all non-current staves are staged (almost) unmodified in "mt"
(3.2) the "current" staff is staged modified (muted) in "mt"
(3.3) the "current" staff is twice duplicated as "siblings" and - with modified visual and sound properties - staged in table "ST1" and "ST2".
(3.4) existing siblings of the "current" staff are skipped.
(4) at the end, all staged staves are "printed out".  If nwcut.status is rc_succes the existing score is overwritten, if nwcut.status = rc_Report, the output is sent to the log window - wich is very useful in debugging mode.

I make a detour to strings before using "" to achieve real duplicates and not new pointers to the same content. This was a real pitfall for me!

Code: [Select · Download]
-- $NWCUT$CONFIG: FileText $
nwcut.status = nwcut.const.rc_Succes
--nwcut.status = nwcut.const.rc_Report

local progname = 'Sibling'
local ASI   = 0              -- Active  Staff Parameters
local ASN   = "UnDefined";
local CSI   = 0              -- Current Staff Parameters
local CSN   = "UnDefined";
local DSG  = "SIBLINGS"
local DSPN = "SiblingInstrument"
local HelpMsg = [[
This tool mutes the active staff and adds 2 copies all its relevant information into 2 new sibling staves.
The active staff is slightly modified if it is not already in this state: the instrument is explicitely specified [line 33] and the staff is muted [line 34].
If staves with sibling name <original_name>_Sibling1 or <original_name>_Sibling1 already exist, they will be removed [line 36].
2 (hidden) sibling staves are added at the end of the score based on the ActiveStaff (named : <original_name>_sibling<i>) [line 67 and line 68].
The midi channels used for sibling staves are 15 and 16 [line 48] and since they are at the end of the score, they will override midi definitions for staves that were assigned earlier to these channels.
The sibling staves are made invisible to avoid sibling them again [line 52].
The sibling staves receive Instrument Patches 00 (piano) and 89 (Pad 2 warm) [line 56].
Instrument changes in the ActiveStaff are skipped in the sibling [line 58].

-- Main processing -------------------
assert(nwcut.getprop('Mode')       == nwcut.const.mode_FileText, "Input type must be 'File Text'")
assert(nwcut.getprop('ReturnMode') == nwcut.const.mode_FileText, "Under 'Options', check 'Returns File Text'")
mt = {} ; mt[0]={}
for item in nwcut.items() do
    if item:Is('Editor')          then  ASI = item.Opts.ActiveStaff + 0 ; end--if
if item:Is('AddStaff')        then  CSI = CSI + 1 ; mt[CSI] = {} ; CSN = item.Opts.Name.Text ; CSOGN = item.Opts.Group.Text ; if CSI == ASI then ASN = CSN end ; end--if
if item:Is('StaffInstrument') then  if not item.Opts.Patch then item.Opts.Patch=0 end ; if not item.Opts.Name  then item.Opts.Name="\"NN\"" end ; end--if
    if item:Is('StaffProperties') and ( CSI == ASI ) and ( item.Opts.Muted ) then item.Opts.Muted="Y" end--if

if not ( string.gsub(CSN,'%-','_') == string.gsub(ASN,'%-','_').."_sibling1" or string.gsub(CSN,'%-','_') == string.gsub(ASN,'%-','_').."_sibling2" ) then table.insert(mt[CSI],tostring(item)) end--if

if CSI == ASI then
       SS1 = ; SS2 =
       if item:Is('AddStaff')  then
          SS1.Opts.Name = CSN .. "_sibling1" ; SS2.Opts.Name = CSN .. "_sibling2" ;
          SS1.Opts.Group = DSG ; SS2.Opts.Group = DSG  
          ST1 = {} ; ST2 = {} ;
       if item:Is('StaffProperties') then
          if ( item.Opts.Muted or item.Opts.Channel or item.Opts.Volume or item.Opts.StereoPan)  then
            SS1.Opts.Muted = "N"    ; SS2.Opts.Muted = "N"               
            SS1.Opts.Channel = 15   ; SS2.Opts.Channel = 16          
            SS1.Opts.Volume = 100   ; SS2.Opts.Volume = 100  
            SS1.Opts.StereoPan = 64 ; SS2.Opts.StereoPan = 64
          elseif item.Opts.Visible then
            SS1.Opts.Visible = "N"  ; SS2.Opts.Visible = "N"
       if item:Is('StaffInstrument') then
          SS1.Opts.Patch = 89    ; SS2.Opts.Patch = 0 ; 
          SS1.Opts.Name  = DSPN  ;  SS2.Opts.Name  = DSPN             
       if item:Is('TempoVariance') and item.Opts.Pause then SS1.Opts.Pause = 0 ; SS2.Opts.Pause = 0 ; end--if
       if not item:Is('Instrument') then table.insert(ST1,tostring(SS1)) ; table.insert(ST2,tostring(SS2)) ; end--if

for j=0,CSI do
   for i=1,#mt[j] do nwcut.writeline (mt[j][i]) end--for
for i=1,#ST1 do nwcut.writeline (ST1[i]) end--for
for i=1,#ST2 do nwcut.writeline (ST2[i]) end--for
General Discussion / Can I send a single staff to different midi channels?
I like a sound that is a combination of a slow starting sound (like synth strings/warm pad) and a fast decading sound (like grand piano). This is also helpful to identify low quality chords when I am working with a new arrangement for our choir.

To achieve this kind of sound, I always duplicate all my staves and allocate the desired midi channels to both of the staves.
But, this way, when I want to rework some of the measures, I always have to make the corrections twice.

Therefore my question: Is it possible to send a single staff to 2 or more midi channels instead of having to duplicate the staff?

If it is not possible - what I think - what options do I have?

* Should I create a new soundfont based on existing sounds?
* Should I try send the output to a kind of VST (synthfont/midiox/...) where duplication could be "easier"?
* Or ... ?

General Discussion / Change note length in all staves at once?
During composing new music, I frequently want to hear how my score would sound if I change some note lengths on a specific moment in the song (for instance modifying 2 eights into a dotted eight and a sixteenth).

For best evaluation I need to change these note lengths in all staves. Until now I always modify the notes in the different staves consequently. And undo everything when I don't like the new rhythm.

In the newer versions of NoteworthyComposer, when moving into another staff with pageup/pagedown, the selection is automatically on the same time frame. This is a really useful feature for this kind of purposes!!

But when enlarging the note lengths, the mechanism selects - of course - also the neighbour notes which are in the same new enlarged time frame.

Are there other / better / easier alternatives to change note lengths (or other modifications like adding staccato's, accents, ...) on a specific "position" in all staves at once?

General Discussion / How do you call this rhythm indication in some music scores?
I have a music score with a rhythm indication on top which states that 2 eight notes should be sung/played as triplets (see Capture.png in attachment).
What is the correct name for this indicator?
Is there a way to add this indicator in NWC songs with the current 2.51 version?
Could the future user object facility be used to create these kind of objects?
General Discussion / Strange tie behaviour in version 2.5.x
In previous versions, when you applied a tie on a chord, the tie for note members did not appear if the following chord did not have that note.
In the newest versions (2.5.1 and  2.5.4) the tie for chord members does appear and remains until that note appears again.
I doubt that this feature was introduced on purpose.

Code: [Select · Download]
|Instrument|Name:"String Ensemble 1"|Patch:48|Trans:0|DynVel:10,30,45,60,75,92,108,127|Pos:8
General Discussion / No MIDI reset when new scores are opened ?
If no specific midi instructions are given, the states from a previous version are kept. So far so good. But, this can lead to unwanted behavior as you will find an example below in nwctxt-format.

F6 or the stop button (sometimes twice) is then a way to reset all the channels.

Is it on purpose that at the beginning of a new score the midi channels are not reset? Are there known disadvantages?
Are there alternatives to avoid the cacaphony in bar 3?

Code: (nwc) [Select · Download]
|Instrument|Name:"Acoustic Grand Piano"|Patch:0|Trans:0|DynVel:10,30,45,60,75,92,108,127|Pos:7|Wide:Y
|Text|Text:"ACTIVE SCORE STOPPED"|Font:StaffItalic|Pos:-10
|Text|Text:"NEW SCORE STARTED"|Font:StaffItalic|Pos:-17
|Instrument|Name:"Church Organ"|Patch:19|Trans:0|DynVel:10,30,45,60,75,92,108,127|Pos:7|Wide:Y
|Text|Text:"WANTED BEHAVIOR"|Font:StaffItalic|Pos:-16
|Instrument|Name:"Church Organ"|Patch:19|Trans:0|DynVel:10,30,45,60,75,92,108,127|Pos:7|Wide:Y

Kind regards,