Music Composition: Difference between revisions

From GMN Wiki
Jump to navigation Jump to search
No edit summary
Line 1: Line 1:
<div id=swordborder style="
__TOC__
left:-243px;
top:10px;">
[[File:wikisidebarart.png|link=]]
</div>


<div id=swordborder style="
== Overview ==
left:-178px;
Ultima Online has always given players freedom to express themselves through their characters, homes, and stories. On Angel Island, musicians can also ''decorate the air'' with the custom Angel Island Music System (AIMS).
top: -172px;">
[[File:wikitop4.png|link=]]
</div>


<div id=cf style="
With AIMS, bards can play notes using the [play command, write arrangements in Razor, create sheet music, and share or sell compositions through the [[Music Box]].
left:-192px;
top: -122px;">
[[File:tchestbase2.gif|class=bottom|link=Main_Page]]
</div>


<div id=cf style="
== Getting Started ==
left:-58px;
Anyone can use [play — no Musicianship or other skill is required. No physical instrument is required either: AIMS supplies a virtual harp, lap harp, or lute. Sound effects (the + numbers) require 1000 music karma; type [play musickarma to see yours.
top: -109px;">
[[File:lit01.gif|class=bottom|link=Main_Page]]
</div>


<div id=cf style="
The basic command is:
left:-145px;
top: -98px;">
[[File:lit02.gif|class=bottom|link=Main_Page]]
</div>


<div id=cf style="
[play note pause note pause ...
left:-70px;
top: -123px;">
[[File:lit04.gif|class=bottom|link=Main_Page]]
</div>


<div id=cf style="
For example:
left:-161px;
top: -109px;">
[[File:lit06.gif|class=bottom|link=Main_Page]]
</div>


<div id=cf style="
[play cl 0.4 cl 0.4 g 0.4 g 0.4 a 0.4 a 0.4 g 0.8
left:-127px;
top: -83px;">
[[File:64.png|class=bottom|link=Main_Page]]
</div>


<div id=cf style="
Numbers represent pauses between notes, in seconds. Begin with the sample tunes below, then explore instrument choices, timing, and reusable passages.
left:-192px;
top: -121px;">
[[File:tchestlid2.gif|class=top|link=Main_Page]]
</div>


<div id=cf style="
=== Note Values ===
left:-114px;
The 25 available note names are:
top: -135px;">
[[File:wikilogo5.png|class=bottom|link=Main_Page]]
</div>


<div id=cf style="
{| class="wikitable"
left:-182px;
! Register !! Notes
top: -165px;">
|-
[[File:aispwiki.png|class=bottom|link=Main_Page]]
| Low || cl (low C), csl (low C#)
</div>
|-
| Main || d, ds, e, f, fs, g, gs, a, as, b, c (middle C), cs
|-
| High || dh, dsh, eh, fh, fsh, gh, gsh, ah, ash, bh, ch (high C)
|}


<div id=menubutton style="
=== Instruments and Note Offsets ===
left:-110px;
AIMS has three virtual instruments in order: Harp (0), LapHarp (1), and Lute (2). Use [play instrument harp, [play instrument lapharp, or [play instrument lute to choose one. The default is Harp.
top: 383px;">
[[File:totoparrow2f.png|class=bottom|link=#top|Back to Top]]
[[File:totoparrow1f.png|class=top|link=#top|Back to Top]]
</div>


<div id=menubutton style="
Prefix a note with + or - to select an adjacent instrument without changing the main instrument. For example, with LapHarp selected, -a plays on Harp, a on LapHarp, and +a on Lute.
left:-140px;
top: 400px;">
[[File:mainmenu02f.png|class=bottom|link=Main_Page]]
[[File:mainmenu01f.png|class=top|link=Main_Page]]
</div>


<div id=menubutton style="
[play instrument lapharp
left:-110px;
[play a +a -a b +b -b c +c -c d +d -d
top: 450px;">
[[File:tobotarrow2.png|class=bottom|link=#footer|Bottom of Page]]
[[File:tobotarrow1.png|class=top|link=#footer|Bottom of Page]]
</div>


<div id=menubutton style="
From Harp, ++ selects Lute; from Lute, -- selects Harp:
left:-140px;
top: 450px;">
[[File:sbit.png|link=]]
</div>


<div id=menubutton style="
[play instrument harp
left:-90px;
[play a +a ++a b +b ++b
top: 450px;">
[play instrument lute
[[File:sbit2.png|link=]]
[play a -a --a b -b --b
</div>


{{#css:
== Composing, Recording and Sharing ==
=== Music Recorder ===
The Music Recorder captures a Razor performance into a composition book, making it easier to edit than pasting scripts manually.


#p-logo { display:none; }
# Enter [MusicRecorder start.
# Play your Razor script.
# Enter [MusicRecorder stop.
# Target a blank composition book.


#p-Quick_Navigation-label {
A script might contain:
    color:orange;
    font-size:62%;
    text-shadow:0px 0px 4px black, 0px 0px 6px white
}


#p-tb-label {
say '[play -e 0.21 -fs b +eh 0.22 -e +eh 0.21 -g b +eh 0.21'
    color:orange;
say '♪ Take my money,'
    font-size:62%;
wait 1400
    text-shadow:0px 0px 4px black, 0px 0px 6px white
}


#n-Download-the-Game a {
The recorder captures [play and spoken lyrics, and estimates waits rounded down to the nearest 100 milliseconds. Review recorded waits before publishing. If waits are consistently excessive, try another client or assistant; Razor bundled with the Angel Island Launcher has generally been responsive.
    color:#FAF9F6;
    font-size:94%;
    text-shadow:0px 0px 4px #0000FF, 2px 2px 8px black
}


#n-Join-the-Discord a {
=== Sheet Music ===
    color:#FAF9F6;
[[Sheet Music]] lets composers transcribe compositions into saleable sheet music. Creating sheet music is also the first step toward adding a song to the Music Box.
    font-size:94%;
    text-shadow:0px 0px 4px #0000FF, 2px 2px 8px black
}


#n-Visit-the-Website a {
=== Music Box ===
    color:#FAF9F6;
[[File:musicbox1.png|thumb|Music Box]]
    font-size:94%;
The [[Music Box]] is a luxury music player for homeowners. It supports spoken commands and lets players sample, purchase, and enjoy compositions by other musicians.
    text-shadow:0px 0px 4px #0000FF, 2px 2px 8px black
}


#n-Install-Guide a {
== Advanced Composition: Sections and Repeats ==
    color:white;
Sections and repeats let you write a musical passage once and reuse it throughout a composition. They are especially helpful for verses, choruses, accompaniment, and songs approaching the 100-page composition-book limit.
    font-size:86%;
    text-shadow:0px 0px 4px #0000FF, 2px 2px 8px black
}


#n-Skills-Overview a {
Section markers are comment lines in the composition book. Razor and ordinary [play commands ignore them, so the musical lines remain Razor-compatible. AIMS expands the arrangement before previewing or transcription.
    color:white;
    font-size:86%;
    text-shadow:0px 0px 4px #0000FF, 2px 2px 8px black
}


#n-Custom-Content a {
=== Named Sections ===
    color:white;
A normal section plays where it is written. You can play it again later by name:
    font-size:86%;
    text-shadow:0px 0px 4px #0000FF, 2px 2px 8px black
}


#n-Wiki-Credits a {
# Section: Chorus
    color:white;
say '[play c 0.3 e 0.3 g 0.3 c 0.5'
    font-size:86%;
# End
    text-shadow:0px 0px 4px #0000FF, 2px 2px 8px black
# Play: Chorus
}
# Play: Chorus x3


#t-whatlinkshere { display:none }
Here the chorus plays once at its definition, once at the first # Play, and three more times at the second # Play.
#t-recentchangeslinked { display:none }
#t-info { display:none }
#t-relatedchanges { display:none }


#t-permalink a {
=== Silent Sections ===
    color:white;
A silent section defines material without playing it at that location. It plays only when called:
    font-size:82%;
    text-shadow:0px 0px 4px #0000FF, 2px 2px 8px black
}


#t-print a {
# Silent Section: Chords
    color:white;
say '[play -e -a -cs 0.44 -e -a -cs 0.28'
    font-size:82%;
say '[play -e -a csl 0.28 -ds -gs -b 0.29'
    text-shadow:0px 0px 4px #0000FF, 2px 2px 8px black
# End
}
# Play: Chords


#t-specialpages a {
=== Simple Repeats ===
    color:white;
Use a repeat when you do not need a reusable name:
    font-size:82%;
    text-shadow:0px 0px 4px #0000FF, 2px 2px 8px black
}


#cf {
# Repeat from here
  position:absolute;
say '[play c 0.2 d 0.2 e 0.2 f 0.2'
  margin:0 auto;
say '[play g 0.2 a 0.2 b 0.2 c 0.5'
  width:238px;
# Repeat x3
}


#swordborder {
The count is the ''total'' number of performances, including the first. Thus x1 plays once, x2 twice, and x3 three times.
  position:absolute;
  margin:0 auto;
  width:1350px;
}


#menubutton {
=== Syntax Reference ===
  position:absolute;
{| class="wikitable"
  margin:0 auto;
! Marker !! Meaning
  width:200px;
|-
}
| # Section: Name || Begins a named passage that plays here and may be called later.
|-
| # Silent Section: Name || Defines a passage that plays only when called.
|-
| # End || Closes the current section.
|-
| # End: Name || Closes the named section; mismatched names are errors.
|-
| # Play: Name || Plays a previously defined, closed section once.
|-
| # Play: Name x3 || Plays it three times here.
|-
| # Repeat from here || Marks the start of a repeat.
|-
| # Repeat x3 || Ends the repeat and plays its contents three times in total.
|}


#cf img {
=== Putting It Together ===
  position:absolute;
This example uses a silent accompaniment inside a verse and repeats the verse:
  left:0;
  -webkit-transition: opacity 0.2s ease-in-out;
  -moz-transition: opacity 0.2s ease-in-out;
  -o-transition: opacity 0.2s ease-in-out;
  transition: opacity 0.2s ease-in-out;
}


#swordborder img {
# Song: Example
  position:absolute;
# Author: Galois
  left:0;
# Instrument: LapHarp
}
# Silent Section: Chords
say '[play -e -a -cs 0.44 -e -a -cs 0.28'
say '[play -e -a csl 0.28 -ds -gs -b 0.29'
# End
# Section: Verse
say '[play -ds -b 0.14 fs 0.14 -fsh 0.14'
# Play: Chords
# End
# Repeat from here
# Play: Verse
# Repeat x2
# Play: Chords x2


#menubutton img {
The verse plays once at its definition, twice more inside the repeat, and the chords play twice at the end.
  position:fixed;
  left:1;
  bottom:0;
  -webkit-transition: opacity 0.2s ease-in-out;
  -moz-transition: opacity 0.2s ease-in-out;
  -o-transition: opacity 0.2s ease-in-out;
  transition: opacity 0.2s ease-in-out;
}


For first and second endings, define the shared passage as a silent section, play it, write the first ending, play it again, and write the second ending:


#cf img.top:hover {
# Silent Section: Theme
  opacity:0;
say '[play c 0.3 e 0.3 g 0.3'
}
# End
# Play: Theme
say '[play a 0.3 g 0.5'
# Play: Theme
say '[play f 0.3 c 0.5'


#menubutton img.top:hover {
=== Rules and Limits ===
  opacity:0;
* Commands are case-insensitive, and spacing is flexible: #play:Chorus x2 and # Play: CHORUS both work.
}
* Section names may contain spaces, must be unique, and must not contain the word "loop".
* Define and close a section before using # Play on it.
* Sections and repeats may be nested, including sections that play other sections, up to eight levels deep.
* Repeat counts range from x1 to x99.
* Each marker must occupy its own line; do not append one to a say line.
* Unrecognized # lines remain comments, such as # Verse 1, # Play softly here, and # End of verse.
* Existing header settings such as # Song:, # Author:, and # Instrument: continue to work.
* A reused section includes all its contents: musical lines, waits, lyrics, and comments.


=== Preview Without Using Paper ===
To hear a composition before transcribing it:


}
# Enter [play preview.
# Target the composition book in your backpack.
# Enter [play preview again to stop.


}}
Preview plays the expanded arrangement just as sheet music would, without consuming manuscript paper. While a preview is active, other [play commands explain how to stop it. On shards with book context menus, single-click the book and choose Start Preview; while playing, choose Stop Preview.


</div>
=== Transcribing and Troubleshooting ===
==General Information==
Transcription still works as before: double-click manuscript paper and target your composition book. AIMS expands sections and repeats into the full arrangement on the resulting sheet. The compact composition and the same music written out in full have the same song identity (hash). Older books without section markers continue to transcribe normally.


Ultima Online has always been known for the freedom it lends its artists, whether decorating their characters, their homes, their outward personalities, or even their inventories in some cases. Now, exclusively on Angel Island, skilled musicians can also ''decorate the air'' (and make a good living doing so) using a brand new, custom designed Music Composition system!
If AIMS finds a structural mistake, transcription stops without consuming the paper. Up to five errors appear in red, followed by a count of any remaining errors. Messages identify the page and line and may suggest a correction:


In general, bards play musical notes using the [play command. Players can select from a variety of instruments, assign notes to hotkeys, and can even script complex compositions using assistants such as razor.
page 37: '# Play: Brige' - no section named "Brige" (did you mean "Bridge"?)


As well, a modernized, in-game music player has been added as a luxury item, which allows players to sell, sample and purchase scripted compositions from other players. Composers who contribute enough quality music to this system also unlock the ability to add the various sounds of Ultima Online to their compositions.
The checks include unknown or duplicate sections, missing or mismatched endings, unmatched repeats, sections played before being closed, self-references, invalid counts, malformed marker placement, and excessive nesting.


==Sheet Music==
== Player Settings and Commands ==
The [play command also configures instruments, timing, volume, and performance behavior.


The new Sheet Music system allows entrepreneurial troubadours to sell the music they compose. Creating Sheet music is also the first step towards adding compositions to the music box.
=== [play Config ===
Displays the current player settings.


See [[Sheet Music]] for more information.
=== [play Instrument ===
Select Harp, LapHarp, or Lute. Default: Harp.


==Music Box==
[play instrument harp
[play instrument lapharp
[play instrument lute


https://game-master.net/images/wiki/musicbox/musicbox1.png
=== [play Timer ===
Choose Classic, Dynamic, or Anchored:


This fully customized, luxury music player has been added to allow Angel Island homeowners to listen to music at their residences. It has been modernized to understand spoken commands, and works in conjunction with Sheet music to simplify the marketplace.
[play timer anchored


For more information, see [[Music Box]]
A composition book can also declare its timer in the header:


==Instructions for Composers==
# Timer: Anchored


Music composition uses the [play command. You do not need an instrument to use it, but require at least 80 skill in Musicianship.  
==== Classic ====
Classic is the original Angel Island timer (2006). It uses a fixed 100-millisecond tick. Notes written together play sequentially, giving a strummed rather than simultaneous-chord effect. Pauses are rounded to 100 milliseconds. Classic is suitable for simple melodies, manual play, and older compositions. It ignores Tempo and Prefetch.


If you don't select an instrument, the default instrument will play, which is a virtual harp. The other two options are the virtual lap harp or virtual Lute.
[play timer classic
 
# Timer: Classic
The basic format for using the [play command is as follows:
 
[play note|pause [note|pause] …
 
===Note Values===
 
There are 25 possible note values:
 
* cl (low C)
 
* csl (low C#)
 
* d (D)
 
* ds (D#)
 
* e (E)
 
* f (F)
 
* fs (F#)
 
* g (G)
 
* gs (G#)
 
* a (A)
 
* as (A#)
 
* b (B)
 
* c (middle C)
 
* cs (C#)
 
* dh (high D)
 
* dsh (high D#)
 
* eh (high E)
 
* fh (high F)
 
* fsh (high F#)
 
* gh (high G)
 
* gsh (high G#)
 
* ah (high A)
 
* ash (high A#)
 
* bh (high B)
 
* ch (high C)
 
===Note Offsets===
 
Note offsets allow you to play different instruments on the same line, without explicitly changing instruments.
 
How it works:  
 
[play uses an array of virtual instruments, which are assigned to a certain order:
 
[0] Harp <br>
[1] LapHarp <br>
[2] Lute <br>
 
If you want to play an individual note on a different instrument, simply precede that note with either one or two plus or minus symbols, depending on which instrument you are playing.


For example, if you are playing a lapharp, you can:
==== Dynamic ====
 
Dynamic (2022) schedules notes using millisecond-based delays, supporting true chords and more detailed rhythms. Tempo specifies the default spacing between successive notes in milliseconds (default 100). Prefetch controls how explicit pauses interact with that spacing: with Tempo 100 and a pause of 500 milliseconds, Prefetch False gives 600 milliseconds between notes, while Prefetch True gives 500.
[play a +a -a b +b -b c +c -c d +d -d
 
What this means is that 'a' is from the lapharp, '-a' is from the harp, and '+a' is from the lute.
Similarly:
 
[play instrument lapharp
[play a +a -a b +b -b c +c -c d +d -d
[play instrument harp
[play a +a ++a b +b ++b c +c ++c d +d ++d
[play instrument lute
[play a -a --a b -b --b c -c --c d -d --d
 
===Incorrect Notes===
 
You need at least 80.0 [[Musicianship]] to use [play
 
However, anything under GM and you will suffer a penalty where you have a chance to play notes incorrectly.
 
===Volume===
 
The Volume of each note can be set using the format vX, where X = any number from 0-20. This should be placed before any note or series of notes which you would like to change.
 
Example:
 
<pre>[play macro part1=v0 1 a v1 1 a v2 1 a v3 1 a v4 1 a v5 1 a v6 1 a v7 1 a
[play macro part2=v8 1 a v9 1 a v10 1 a v11 1 a v12 1 a v13 1 a v14 1 a v15 1 a v16 1 a
[play macro part3=v17 1 a v18 1 a v19 1 a v20 1 a v21 1 a v22 1 a v23 1 a v24 1 a
[play macro part4=v25 1 a v26 1 a v27 1 a v28 1 a v29 1 a v30 1 a v31 1 a v32 1 a
[play %part1% %part2%  %part3%  %part4% </pre>
 
You must also enable concert mode using the command [play ConcertMode True if you want other people to hear the differences in volume. Without concert mode activated, volume for others will remain at its default of 20 (ie. Max volume) which diminishes the further they are from the source of the music.
 
===Music Karma===
 
Musicians with high enough music karma can mimic the various sound files in the game client using the [play command. Music Karma is gained by publishing songs and selling them.
 
1000 music karma is required for playing sounds other than musical notes. You gain 100 points per composition added to the [[Music Box]] global repository (once approved) and an additional 100 points for every time your song gets purchased.
 
For a full list of available sounds and their corresponding numbers, see [[Sound List]].
 
===Titles for Composers===
 
After joining the NPC Bards guild, players can earn the profession based title of Composer by composing music. This title is based on "skill" level, ranging from Neophyte to Grandmaster (ie. Adept Composer.)
 
Similarly to Music Karma, points to upgrade your Composer skill level are earned through various uses of the composition system. These include:
 
* # of songs published
* # of times published songs have been sold.
* # of times published songs have been played.
* use of the [play command in general also helps to increase skill level. Bonus points are awarded for also using advanced music composition features.
 
Note that points earned for use of the [play command are not tracked until after your character has joined the Bards guild.
 
However, points will accrue even before joining for anything that is published and subsequently played or sold. These points will be automatically added to your character upon joining.
 
In addition to skill points, you will also gain regular Karma and Fame from getting works published, their plays and sales.
 
===Player Options===
 
The [play command (or "player") has multiple directives which must be specified using a variety of sub-commands:
 
====[play Config====
 
Displays the [play configuration settings.
 
====[play Instrument====
 
Selects the instrument.
 
Format: Harp, Lapharp, Lute.
 
Examples:
 
* [play instrument harp
* [play instrument lapharp
* [play instrument lute
 
Default: Harp
 
====[play Timer====
 
Format: Classic, Dynamic, or Anchored
 
Example: [play timer anchored
 
Song Header: # Timer: Anchored
 
The AIMS music system provides three timing modes, each offering a different approach to musical playback.
 
The selected timing mode determines how notes are spaced, how pauses are interpreted, and how accurately a composition maintains its intended rhythm.
 
=====Classic=====
 
Command: [play timer classic
 
Song Header: # Timer: Classic
 
Classic is the original Angel Island music timer, introduced in 2006.
 
It operates on a fixed 100-millisecond (0.1-second) clock, playing one note per tick. This produces the familiar, slightly mechanical sound of traditional Ultima Online music.
 
Notes written together are played sequentially rather than simultaneously, creating a strumming effect instead of a true chord.
 
Pauses are rounded to the timer's 100-millisecond resolution, making Classic less suitable for complex rhythms or precisely timed arrangements.
 
Classic is particularly well suited for:
* Simple melodies.
* Manually entered notes.
* Older compositions written for the original music system.
* Players who prefer the traditional UO musical style.
 
Classic ignores Tempo and Prefetch settings.
 
=====Dynamic=====
 
Command: [play timer dynamic
 
Song Header: # Timer: Dynamic
 
Dynamic was introduced in 2022 to give composers considerably more control over musical timing.
 
Unlike Classic, Dynamic schedules individual notes using millisecond-based delays rather than a fixed 100-millisecond clock.
 
This allows composers to create true chords, complex rhythms, and precisely controlled pauses.
 
Dynamic supports two important settings:
 
* '''Tempo:''' Specifies the spacing between successive notes in milliseconds. The default is 100.
* '''Prefetch:''' Determines whether an explicit pause replaces the normal Tempo delay or is added to it.
 
For example, with Tempo set to 100 milliseconds and a pause of 500 milliseconds:
 
* Prefetch False: 600 milliseconds between notes.
* Prefetch True: 500 milliseconds between notes.
 
A common configuration for modern compositions is:


  # Timer: Dynamic
  # Timer: Dynamic
Line 479: Line 222:
  # Tempo: 0
  # Tempo: 0


With this configuration, notes written together can form chords, while explicit pauses control the rhythm.
Because Dynamic schedules relative to the previous note's actual playback time, small delays can accumulate in longer pieces. Testing has shown drift approaching 10% in some cases.


Dynamic is particularly well suited for:
==== Anchored ====
* Complex compositions.
Anchored supports Dynamic-style chords, Tempo, and Prefetch, but schedules notes relative to the composition's start. This reduces accumulated timing drift. After a server interruption such as a world save, it adjusts its timing reference rather than releasing a burst of overdue notes. Anchored is a good choice for long, rhythmically complex pieces.
* Chords and layered arrangements.
* Precise control over note spacing.
* Existing compositions designed for the Dynamic timer.


'''Timing Considerations'''
# Timer: Anchored
 
# Prefetch: True
Dynamic calculates each note's timing relative to when the previous note actually played.
# Tempo: 0
 
Small scheduling delays can therefore accumulate throughout a composition, causing longer songs to play somewhat slower than intended.
 
In testing, accumulated timing drift has sometimes approached 10%.
 
For compositions where maintaining the intended overall tempo is particularly important, Anchored is generally the better choice.
 
=====Anchored=====


Command: [play timer anchored
Existing Dynamic pieces can generally use Anchored without rewriting their notes or pauses.
 
Song Header: # Timer: Anchored
 
Anchored combines the expressive capabilities of Dynamic with improved timing accuracy.
 
Like Dynamic, it supports millisecond-based scheduling, true chords, Tempo, and Prefetch.
 
The important difference is how notes are scheduled.
 
Rather than calculating each note's timing relative to when the previous note actually played, Anchored calculates the intended timing of each note relative to the beginning of the composition.
 
This prevents small scheduling delays from accumulating throughout the performance.
 
For example, a composition intended to last four minutes should remain close to four minutes, rather than gradually falling behind its intended schedule.
 
'''Handling Server Delays'''
 
Occasionally, the server may experience a brief interruption, such as during a world save.
 
Anchored handles these interruptions without attempting to play a large backlog of notes simultaneously.
 
Instead, it adjusts its timing reference and continues the composition naturally.
 
This preserves the musical arrangement while avoiding an unnatural burst of notes following an interruption.
 
Anchored is particularly well suited for:
* Long compositions.
* Complex musical arrangements.
* Performances where consistent tempo is important.
* Compositions requiring accurate rhythmic relationships.
* Music originally written for Dynamic that would benefit from reduced timing drift.
 
Because Anchored uses the same composition rules as Dynamic, existing Dynamic compositions can generally be switched to Anchored without rewriting their notes or pauses.
 
=====Choosing a Timing Mode=====


==== Timing Mode Comparison ====
{| class="wikitable"
{| class="wikitable"
! Feature
! Feature !! Classic !! Dynamic !! Anchored
! Classic
! Dynamic
! Anchored
|-
|-
| Timing resolution
| Resolution || 100 ms tick || Millisecond-based || Millisecond-based
| 100 milliseconds
| Millisecond-based
| Millisecond-based
|-
|-
| True chords
| True chords || No || Yes || Yes
| No
| Yes
| Yes
|-
|-
| Tempo and Prefetch
| Tempo / Prefetch || Ignored || Supported || Supported
| Ignored
| Supported
| Supported
|-
|-
| Accumulated timing drift
| Timing drift || Fixed-tick behavior || Can accumulate || Minimized
| Traditional fixed-tick behavior
| May accumulate
| Minimized
|-
|-
| Best suited for
| Best for || Simple and legacy music || Detailed arrangements || Detailed arrangements with stable tempo
| Simple melodies and older compositions
| Complex compositions and arrangements
| Complex compositions requiring consistent timing
|}
|}


=====Song Headers=====
==== Compatibility ====
 
Legacy NewTimer settings remain supported:
Composers can select the timing mode directly in their sheet music using the Timer header.
 
Examples:
 
# Timer: Classic
# Timer: Dynamic
# Timer: Anchored
 
Only one timing mode should be specified.
 
Additional settings can be included as needed:
 
# Timer: Anchored
# Prefetch: True
# Tempo: 0
 
This configuration provides true chords, precise control over pauses, and improved long-term timing accuracy.
 
=====Backward Compatibility=====
 
The original NewTimer format remains supported for existing compositions and player commands.
 
Legacy song headers:


  # NewTimer: False
  # NewTimer: False
  # NewTimer: True
  # NewTimer: True
Legacy commands:
  [play newtimer false
  [play newtimer false
  [play newtimer true
  [play newtimer true


These correspond to the newer timing modes as follows:
NewTimer False corresponds to Classic; NewTimer True corresponds to Dynamic. If both Timer and NewTimer headers are present, Timer wins. Without an explicit timer setting, songs default to Classic.


* NewTimer False = Classic
=== [play Prefetch ===
* NewTimer True = Dynamic
Use with Dynamic or Anchored (not Classic):


When both Timer and NewTimer headers are present, Timer takes precedence.
[play prefetch true


Songs without an explicit timing mode default to Classic.
When enabled, an explicit pause replaces rather than adds to the default Tempo interval. Default: False. Older compositions may need pause adjustments when switching modes. See [[#Advanced Usage|Advanced Usage]].


Existing compositions do not need to be modified to continue working.
=== [play Tempo ===
Tempo controls the default spacing between notes in milliseconds for Dynamic and Anchored.


====[play Prefetch====
[play tempo 100


''Note: Prefetch is available only when the New Timer is turned on by being set to true.''
At 50, the default interval is half as long as at 100; at 200 it is twice as long. Changing Tempo after composing may require adjusting explicit pauses. Default: 100.


Format: True or False
=== [play Reset ===
Resets the player to its defaults: Harp, Classic (NewTimer False), Prefetch False, Tempo 100.


Example [play prefetch true
=== [play + (Sound Effects) ===
With at least 1,000 Music Karma, musicians can use sound IDs from the game client:


Prefetch schedules the next pause immediately without waiting for the next timer cycle. The result is better responsiveness.
[play +480


Note that existing tracks composed under the old timer will need their pauses reworked to work with prefetch.
Here +480 is the sound associated with targeting the Cure spell. See [[Sound List]].


For more information about prefetch usage, see the Advanced Usage section of this page.
=== [play Chatter ===
[play chatter true


Default: False
Enables or disables the ''*Plays a tune*'' emote. Default: False.


====[play Tempo====
=== [play ConcertMode ===
[play ConcertMode True


Format: Number
Allows nearby listeners to hear the volume levels set by the musician regardless of distance. Default: False.


Example: [play tempo 100
=== [FilterMusic ===
Toggles whether composition music plays on your client; it does not silence music for others.


In the above example, 100 is the timer frequency you want. A tempo of 100 is a 100-millisecond timer and is the same granularity as the old-timer model.
=== [StopMusic ===
Stops your character's [play performance immediately.


a tempo of 50 is twice as fast as 100, 200 is twice as slow.
== Volume, Music Karma and Composer Titles ==
=== Volume ===
Place vN before a note or group of notes to change volume. The original examples demonstrate volume steps with macros:


Setting the tempo to 200 for a tune composed at 100 will allow a nice slow playback to help the composer debug their tune.
[play macro part1=v0 1 a v1 1 a v2 1 a v3 1 a v4 1 a v5 1 a v6 1 a v7 1 a
[play macro part2=v8 1 a v9 1 a v10 1 a v11 1 a v12 1 a v13 1 a v14 1 a v15 1 a v16 1 a
[play macro part3=v17 1 a v18 1 a v19 1 a v20 1 a v21 1 a v22 1 a v23 1 a v24 1 a
[play macro part4=v25 1 a v26 1 a v27 1 a v28 1 a v29 1 a v30 1 a v31 1 a v32 1 a
[play %part1% %part2% %part3% %part4%


Note that it is a good idea to set the tempo correctly at the beginning, before writing the song, as changing it after will require adjustments to pause lengths.  
Enable [play ConcertMode True if you want other listeners to hear these volume differences; otherwise their playback uses the normal distance-based volume.


Default: 100
=== Music Karma ===
Musicians earn Music Karma through publishing and selling compositions. At 1,000 Music Karma, they may use non-musical sounds from the game client with [play. An approved composition added to the [[Music Box]] global repository earns 100 points, and each purchase earns another 100 points. See [[Sound List]].


====[play Reset====
=== Composer Titles ===
Join the NPC Bards Guild to work toward the Composer profession title, progressing from Neophyte to Grandmaster. Progress comes from publishing, sales, plays, and use of [play, with bonuses for advanced features. [play usage counts only after joining the guild; publishing, plays, and sales before joining are credited when you join. Published works can also earn ordinary Karma and Fame.


The reset command resets the player configuration to all default values, which are:
== Algebraic Macros ==
Macros let you name a note sequence, reuse it, transpose it, reverse it, or change its pauses. Unlike sections, macros transform note patterns; sections reuse complete passages, including waits and lyrics.


instrument = harp
=== Defining and Playing a Macro ===
[play macro bassline = cl 0.2 e 0.2 g 0.2 a
[play %bassline%
[play instrument harp
[play %bassline% 0.2 %bassline%


newtimer = false
=== Transposing ===
[play %bassline[+5]%


prefetch = false
This transposes five half-steps upward (a perfect fourth):


tempo = 100
[play f 0.2 a 0.2 c 0.2 dh


====[play +====
Use [+n] or [-n]. Notes outside the supported cl-to-ch range are dropped.


Format: Number
=== Reversing ===
[play %-bassline%


Example: [play +480
This reverses the sequence:


In the above example, the musician has instructed the player to play a noise from the sound file list in the game client. +480 is the noise the game client produces when the cure spell is targeted.  
[play a 0.2 g 0.2 e 0.2 cl


Remember that this command only becomes available to players who have a combined total of 1000 or greater Music Karma, explained above.
For example, a blues-style pattern can combine original and reversed macros:


====[play chatter====
[play %bassline% 0.2 as 0.2 %-bassline%
[play %bassline% 0.2 as 0.2 %-bassline%
[play %bassline[+5]% 0.2 dsh 0.2 %-bassline[+5]%
[play %bassline% 0.2 as 0.2 %-bassline%
[play %bassline[+7]% 0.2 %bassline[+5]% 0.2
[play %bassline% 0.2 as 0.2 %-bassline%


Format: True or False
=== Changing Pauses ===
[play %bassline<+0.1>%


Example: [play chatter true
Adds 0.1 second to every pause, producing:


The chatter directive enables or disables the *Plays a tune* emote message.
[play cl 0.3 e 0.3 g 0.3 a


Default: False
The arithmetic operators can be combined with a macro:


====[play ConcertMode====
{| class="wikitable"
 
! Expression !! Resulting pauses
Format: True or False
|-
 
| %bassline% || 0.2
Example: [play ConcertMode True
|-
 
| %bassline<+0.01>% || 0.21
Concert mode allows for all users within range of the music player to hear the volumes as set by the musician, regardless of how close or far they are from the source.
|-
 
| %bassline<-0.01>% || 0.19
Default: False
|-
 
| %bassline<*2>% || 0.4
===Other Commands===
|-
 
| %bassline</2>% || 0.1
The following is a list of other commands that pertain to the music composition system:
|}
 
====[FilterMusic====
 
The filter music command is a toggle which enables or disables music composition sounds from playing. Note that this command only disables the audio on your end, but other players will still be able to hear it.
 
====[StopMusic====
 
The stop music command will halt your character from [playing music immediately.
 
===Algebraic Macros===
 
You can now write musical macros using algebra, which allows players to re-use preset pieces of music that you've already written quickly and easily. Here is an example:
 
<pre>[play macro bassline = cl 0.2 e 0.2 g 0.2 a
 
[play %bassline% </pre>
 
Now you can play that macro in another instrument:
 
<pre>[play instrument harp
 
[play %bassline% 0.2 %bassline% </pre>
 
But where these macros become more powerful is in the ability to transpose them, reverse them, or change their tempo.
 
====Transposing====
 
Here is an example:
 
<pre>[play %bassline[+5]% </pre>
 
This will transpose the macro 'bassline' up by 5 notes, or half-steps (a perfect fourth, for the musicians) - so it becomes, in effect:
 
<pre>[play f 0.2 a 0.2 c 0.2 dh </pre>
 
You can transpose up (with [+n]) or down (with [-n]). However, if you try to transpose notes downward such that they go beyond cl, they'll be dropped. Similarly, notes transposed up beyond ch will be dropped.
 
====Reversing====
 
<pre>[play %-bassline% </pre>
 
This will play the macro 'bassline' in reverse order, so it becomes, in effect:
 
<pre>[play a 0.2 g 0.2 e 0.2 cl </pre>
 
So we could turn our little %bassline% macro into a complete 12-bar blues bassline like this:
 
<pre>[play %bassline% 0.2 as 0.2 %-bassline%
 
[play %bassline% 0.2 as 0.2 %-bassline%
 
[play %bassline[+5]% 0.2 dsh 0.2 %-bassline[+5]%
 
[play %bassline% 0.2 as 0.2 %-bassline%
 
[play %bassline[+7]% 0.2 %bassline[+5]% 0.2
 
[play %bassline% 0.2 as 0.2 %-bassline%</pre>
 
====Changing Tempo====
 
<pre>[play %bassline<+0.1>% </pre>
 
This will add 0.1 to every pause in the macro. So this would play, in effect:
 
<pre>[play cl 0.3 e 0.3 g 0.3 a </pre>
 
Tempo adjustment supports all four of the arithmetic operators. Here's a quick reference:
 
<pre>[play %bassline%         =>  [play cl 0.2 e 0.2 g 0.2 a
 
[play %bassline<+0.01>%  =>  [play cl 0.21 e 0.21 g 0.21 a
 
[play %bassline<-0.01>%  =>  [play cl 0.19 e 0.19 g 0.19 a
 
[play %bassline<*2>%     =>  [play cl 0.4 e 0.4 g 0.4 a
 
[play %bassline</2>%     =>  [play cl 0.1 e 0.1 g 0.1 a </pre>
 
====Combining Operations====
 
All of these operations can be mixed and matched to create the musical effect that you want. For instance, if we start with a couple of simple macros for a minor and a major arpeggio:
 
<pre>[play macro min = cl 0.1 ds 0.1 g 0.1 c
 
[play macro maj = cl 0.1 e 0.1 g 0.1 c </pre>
 
We can turn these into something a little like ABBA:
 
<pre>[play %min[+2]</2>% 0.2 %-min[+2]</2>% 0.8
 
[play %min[+2]</2>% 0.2 %-min[+2]</2>% 0.1 e 0.1 f 0.1 g 0.1 a 0.8
 
[play %maj[+5]</2>% 0.2 fh 0.05 eh 0.05 c 0.05 a 0.8
 
[play %min[+2]</2>% 0.2 %-min[+2]</2>% 0.8 </pre>
 
Or something a little like Pachelbel:
 
<pre>[play %maj[+12]<2>% 0.2 %maj[+7]<2>% 0.2 %min[+9]<2>% 0.2 %min[+4]<2>% 0.2
 
[play %maj[+5]<2>% 0.2 %maj<2>% 0.2 %maj[+5]<2>% 0.2 %maj[+7]<2>% </pre>
 
... all with the same simple building blocks!
 
Many thanks to Galois for contributing the Algebraic Macros section.
 
===Music Capture System===
 
The Music Capture System, or Music Recorder, is a cleaner way of entering the data from a music composition script into the composition book than simply pasting your razor scripts into them.
 
Using the recorder greatly enhances the user experience when editing and refining compositions.
 
====Usage====
 
The basic usage of the music recorder goes as follows:
 
1. [MusicRecorder start
 
2. Play your Razor script.
 
3. [MusicRecorder stop
 
4. Target your composition book.
 
Here is an example of what your script might look like:
 
<pre>say '[play -e 0.21 -fs b +eh 0.22 -e +eh 0.21 -g b +eh 0.21 -e b +eh 0.24 -fs 0.24 -e 0.19'
 
say '♪ Take my money,'
 
wait 1400</pre>
 
After the music recorder has started recording, it will record everything that is input using the [play command, and any other say commands (lyrics.) It will also estimate wait lengths, and round them down to the nearest 100 milliseconds.
 
Once it is stopped, you will be prompted to target a blank composition book. After targeting the book, you should review the information and make sure your wait times are correct.
 
If wait times seem to be in excess too often, you may try using a different client or assistant. We have found that the version of razor that comes alongside CUO when installing via the Angel Island Launcher seems to be more responsive than other versions, but feel free to check and see what works best for you.
 
===Sample Tunes===
 
====Twinkle Twinkle Little Star====
 
(Razor: Add a 2sec pause after the third line, and a 4sec pause before the last line.)
 
<pre>[play cl 0.4 cl 0.4 g 0.4 g 0.4 a 0.4 a 0.4 g 0.8
 
[play f 0.4 f 0.4 e 0.4 e 0.4 d 0.4 d 0.4 cl 0.8
 
[play g 0.4 g 0.4 f 0.4 f 0.4 e 0.4 e 0.4 d 0.8
 
[play g 0.4 g 0.4 f 0.4 f 0.4 e 0.4 e 0.4 d 0.8
 
[play cl 0.4 cl 0.4 g 0.4 g 0.4 a 0.4 a 0.4 g 0.8
 
[play f 0.4 f 0.4 e 0.4 e 0.4 d 0.4 d 0.4 cl 0.8 </pre>
 
====Frere Jacques====
 
(Razor: Add a 1sec pause between the 2nd and 3rd lines.
 
<pre>[play c 0.3 dh 0.3 eh 0.3 c 0.4 c 0.3 dh 0.3 eh 0.3 c 0.3
 
[play eh 0.3 fh 0.3 gh 1.0 eh 0.3 fh 0.3 gh 1.0 gh 0.1 ah 0.1 gh 0.1 fh 0.1 eh 0.3 c 0.3
 
[play gh 0.1 ah 0.1 gh 0.1 fh 0.1 eh 0.3 c 0.4 c 0.3 g 0.3 c 1.0 c 0.3 g 0.3 c </pre>
 
====Pop Goes the Weasel====
 
<pre>[play d 0.2 g 0.6 g 0.2 a 0.6 a 0.2 b 0.2 dh 0.2 b 0.2 g 0.6
 
[play d 0.2 g 0.6 g 0.2 a 0.6 c 0.2 b 0.8 g 0.6
 
[play d 0.2 g 0.6 g 0.2 a 0.6 a 0.2 b 0.2 dh 0.2 b 0.2 g 0.8
 
[play eh 0.8 a 0.4 c 0.2 b 0.8 g </pre>
 
==Advanced Usage==
 
The following information has been submitted by Galois to help Angel Island's musicians understand some of the more complex settings involved with the Music Composition system.
 
===Understanding Prefetch and NewTimer===
 
Here's a diagram of what's going on when you play some simple notes:
 
[play cl 0.1 d 0.1 e
 
https://game-master.net/images/wiki/musicbox/musicbox14.png
 
 
The tempo parameter determines the duration of the "resonance" period. This means you can't just use tempo to arbitrarily scale the speed of your piece up and down - you'll have to adjust the designated pauses to match.
 
The prefetch parameter determines whether the music engine waits for a note to finish resonating before beginning the pause. [1] So with prefetch enabled, you can play notes very quickly:
 
 
[play cl 0.01 d 0.01 e 0.01 f 0.01 g
 
 
Using a negative pause when prefetch is disabled makes that pause a prefetch pause. So you can use negative pauses to play notes quickly in succession, e.g.,
 
 
[play cl -0.01 d -0.01 e -0.01 f -0.01 g
 
 
Taken together, you can use prefetching (either by using the prefetch parameter or by using negative pauses) to dial in your rhythm very precisely. See the below example for getting 3 notes against 2, for instance.
 
===Repeating Notes===
 
One wrinkle is that the client has a built-in limitation on repeating the same .wav file - probably to save our ears from obnoxious footstep sounds. So if you try to repeat the same note rapidly, any notes struck while a previous note is still sounding (literally while the .wav file for that note is still playing in the client) will be ignored.
 
The duration of the .wav files is different by instrument - so lutes can be repeated much faster than standing harps. Also, if you change instruments, you can repeat notes very quickly (since it's literally playing different .wav files), though you're limited to notes that exist within both instruments' registers.
 
===Using Multiple Instruments===


Here's an example of using multiple instruments within the same line, so the "accompaniment" (a rather unimaginative rendition of the repeating g-sharps and c-sharps from the Chariots of Fire theme) can be in on the standing harp, while the melody is on the lap harp (note the +cs, +fsh, etc):
=== Combining Operations ===
Define minor and major arpeggios:


[play macro min = cl 0.1 ds 0.1 g 0.1 c
[play macro maj = cl 0.1 e 0.1 g 0.1 c


Then transpose, reverse, and change their pacing in the same expression:


say '[play newtimer true'
[play %min[+2]</2>% 0.2 %-min[+2]</2>% 0.8
[play %min[+2]</2>% 0.2 %-min[+2]</2>% 0.1 e 0.1 f 0.1 g 0.1 a 0.8
[play %maj[+5]</2>% 0.2 fh 0.05 eh 0.05 c 0.05 a 0.8
[play %min[+2]</2>% 0.2 %-min[+2]</2>% 0.8


say '[play prefetch false'
Or a Pachelbel-inspired progression:


say '[play tempo 90'
[play %maj[+12]<2>% 0.2 %maj[+7]<2>% 0.2 %min[+9]<2>% 0.2 %min[+4]<2>% 0.2
[play %maj[+5]<2>% 0.2 %maj<2>% 0.2 %maj[+5]<2>% 0.2 %maj[+7]<2>%


say '[play instrument harp'
Many thanks to Galois for contributing the algebraic macros material.


 
== Sample Tunes ==
=== Twinkle Twinkle Little Star ===
In Razor, add a two-second pause after the third line and a four-second pause before the last line.


say '[play csl 0.1 csl 0.1 csl 0.1 csl 0.1'
[play cl 0.4 cl 0.4 g 0.4 g 0.4 a 0.4 a 0.4 g 0.8
[play f 0.4 f 0.4 e 0.4 e 0.4 d 0.4 d 0.4 cl 0.8
[play g 0.4 g 0.4 f 0.4 f 0.4 e 0.4 e 0.4 d 0.8
[play g 0.4 g 0.4 f 0.4 f 0.4 e 0.4 e 0.4 d 0.8
[play cl 0.4 cl 0.4 g 0.4 g 0.4 a 0.4 a 0.4 g 0.8
[play f 0.4 f 0.4 e 0.4 e 0.4 d 0.4 d 0.4 cl 0.8


wait 800
=== Frère Jacques ===
In Razor, add a one-second pause between the second and third lines.


say '[play csl 0.1 csl 0.1 csl -0.01 +cs 0.1 csl 0.1'
[play c 0.3 dh 0.3 eh 0.3 c 0.4 c 0.3 dh 0.3 eh 0.3 c 0.3
[play eh 0.3 fh 0.3 gh 1.0 eh 0.3 fh 0.3 gh 1.0 gh 0.1 ah 0.1 gh 0.1 fh 0.1 eh 0.3 c 0.3
[play gh 0.1 ah 0.1 gh 0.1 fh 0.1 eh 0.3 c 0.4 c 0.3 g 0.3 c 1.0 c 0.3 g 0.3 c


wait 800
=== Pop Goes the Weasel ===
[play d 0.2 g 0.6 g 0.2 a 0.6 a 0.2 b 0.2 dh 0.2 b 0.2 g 0.6
[play d 0.2 g 0.6 g 0.2 a 0.6 c 0.2 b 0.8 g 0.6
[play d 0.2 g 0.6 g 0.2 a 0.6 a 0.2 b 0.2 dh 0.2 b 0.2 g 0.8
[play eh 0.8 a 0.4 c 0.2 b 0.8 g


# Note 3 against 2 rhythm
== Advanced Usage ==
The following technical observations and examples were contributed by Galois. They describe the behavior of the Dynamic/NewTimer system and are useful for understanding timing choices.


say '[play csl -0.01 +fsh 0.08 csl -0.07 +gsh -0.15 csl -0.15 +ash -0.07 csl 0.1'
=== Understanding Prefetch and NewTimer ===
Consider:


wait 800
[play cl 0.1 d 0.1 e


say '[play csl -0.01 +gsh 0.08 csl 0.1 csl 0.1 csl 0.1'
[[File:musicbox14.png|thumb|Timing illustration]]


wait 800
Tempo determines the default note spacing. Prefetch controls whether an explicit pause begins without adding the default delay. Thus you can play closely spaced notes with Prefetch enabled:


say '[play csl -0.01 +fh 0.08 csl 0.1 csl 0.1 csl 0.1'
[play cl 0.01 d 0.01 e 0.01 f 0.01 g
 


With Prefetch disabled, negative pauses can also request prefetch-style spacing:


[1] :  One quirk to keep in mind is that if no pause is specified (e.g., [play cl d e) prefetch won't be used. So [play cl d e will sound the same whether prefetch is true or false.  
[play cl -0.01 d -0.01 e -0.01 f -0.01 g


===Additional Information===
These tools help tune precise rhythms such as three notes against two. If no pause is specified (for example, [play cl d e), Prefetch has no effect on that interval.


====A Case Study: Making the 3-over-2 rhythm====
=== Repeating Notes ===
The client has a limitation when replaying the same sound file rapidly. A repeated note may be ignored while its previous sound is still playing. Sound durations vary by instrument; lute notes can generally be repeated faster than standing-harp notes. Switching instruments can sometimes help because the client then plays a different sound file, provided the desired note exists in both registers.


Where did the particular pause durations come from, other than trial-and-error?
=== Using Multiple Instruments ===
This example combines a standing-harp accompaniment with lap-harp melody, inspired by ''Chariots of Fire'':


1. First, I figured out the tempo I wanted, and settled on tempo=90, with 0.1 pauses. That seemed like a good enough "feel" for the Chariots of Fire bassline.
say '[play newtimer true'
say '[play prefetch false'
say '[play tempo 90'
say '[play instrument harp'
say '[play csl 0.1 csl 0.1 csl 0.1 csl 0.1'
wait 800
say '[play csl 0.1 csl 0.1 csl -0.01 +cs 0.1 csl 0.1'
wait 800
# Note 3 against 2 rhythm
say '[play csl -0.01 +fsh 0.08 csl -0.07 +gsh -0.15 csl -0.15 +ash -0.07 csl 0.1'
wait 800
say '[play csl -0.01 +gsh 0.08 csl 0.1 csl 0.1 csl 0.1'
wait 800
say '[play csl -0.01 +fh 0.08 csl 0.1 csl 0.1 csl 0.1'


2. Second, I had to figure out how long the actual "resonance" period was. I knew I'd be able to calculate that if I could make some pauses exactly twice as long as others. So I did some experiments. I started with:
=== Case Study: A Three-Over-Two Rhythm ===
Galois first chose Tempo 90 with 0.1-second pauses for the desired accompaniment feel. To estimate the effective timing interval, he compared:


[play cl 0.1 cl 0.1 cl 0.1 cl 0.1 g 0.3 g 0.3 cl 0.1 cl 0.1 cl 0.1 cl 0.1 g 0.3 g 0.3


[play cl 0.1 cl 0.1 cl 0.1 cl 0.1 g 0.3 g 0.3 cl 0.1 cl 0.1 cl 0.1 cl 0.1 g 0.3 g 0.3
With a more closely matched rhythm:
 


This would have been the best we could do with the old timer system, but it's not quite right. So I fiddled a bit, and ended up with:
[play cl 0.1 cl 0.1 cl 0.1 cl 0.1 g 0.34 g 0.34 cl 0.1 cl 0.1 cl 0.1 cl 0.1 g 0.34 g 0.34
 


[play cl 0.1 cl 0.1 cl 0.1 cl 0.1 g 0.34 g 0.34 cl 0.1 cl 0.1 cl 0.1 cl 0.1 g 0.34 g 0.34
The timing relationship was:
 


So doing a little math, I reasoned that:
2 * (0.01 + x + 0.1) = 0.01 + x + 0.34


2 * (0.01 + x + 0.1) = 0.01 + x + 0.34
This suggested an effective interval component of about 0.13 seconds at that tempo. Four eighth-note intervals then total:


and calculated that the resonance period is about 0.13 at this tempo. Therefore, if those are eighth notes, 2 beats of them will be 4 * (0.01 + 0.13 + 0.10) = 4 * 0.24 = 0.96
4 * (0.01 + 0.13 + 0.10) = 0.96 seconds


That's conveniently divisible by 3, so we know that each triplet should be 0.32 total. So now it was just a matter of stacking up the notes so that baseline sounded on 0.0, 0.24, 0.48, 0.72 and 0.96, while the triplets sounded on 0.0, 0.32, and 0.64.
Dividing this into three yields 0.32 seconds per triplet. The bassline falls at 0.00, 0.24, 0.48, 0.72, and 0.96 seconds, while the triplets fall at 0.00, 0.32, and 0.64 seconds.

Revision as of 14:41, 30 October 2026

Overview

Ultima Online has always given players freedom to express themselves through their characters, homes, and stories. On Angel Island, musicians can also decorate the air with the custom Angel Island Music System (AIMS).

With AIMS, bards can play notes using the [play command, write arrangements in Razor, create sheet music, and share or sell compositions through the Music Box.

Getting Started

Anyone can use [play — no Musicianship or other skill is required. No physical instrument is required either: AIMS supplies a virtual harp, lap harp, or lute. Sound effects (the + numbers) require 1000 music karma; type [play musickarma to see yours.

The basic command is:

[play note pause note pause ...

For example:

[play cl 0.4 cl 0.4 g 0.4 g 0.4 a 0.4 a 0.4 g 0.8

Numbers represent pauses between notes, in seconds. Begin with the sample tunes below, then explore instrument choices, timing, and reusable passages.

Note Values

The 25 available note names are:

Register Notes
Low cl (low C), csl (low C#)
Main d, ds, e, f, fs, g, gs, a, as, b, c (middle C), cs
High dh, dsh, eh, fh, fsh, gh, gsh, ah, ash, bh, ch (high C)

Instruments and Note Offsets

AIMS has three virtual instruments in order: Harp (0), LapHarp (1), and Lute (2). Use [play instrument harp, [play instrument lapharp, or [play instrument lute to choose one. The default is Harp.

Prefix a note with + or - to select an adjacent instrument without changing the main instrument. For example, with LapHarp selected, -a plays on Harp, a on LapHarp, and +a on Lute.

[play instrument lapharp
[play a +a -a b +b -b c +c -c d +d -d

From Harp, ++ selects Lute; from Lute, -- selects Harp:

[play instrument harp
[play a +a ++a b +b ++b
[play instrument lute
[play a -a --a b -b --b

Composing, Recording and Sharing

Music Recorder

The Music Recorder captures a Razor performance into a composition book, making it easier to edit than pasting scripts manually.

  1. Enter [MusicRecorder start.
  2. Play your Razor script.
  3. Enter [MusicRecorder stop.
  4. Target a blank composition book.

A script might contain:

say '[play -e 0.21 -fs b +eh 0.22 -e +eh 0.21 -g b +eh 0.21'
say '♪ Take my money,'
wait 1400

The recorder captures [play and spoken lyrics, and estimates waits rounded down to the nearest 100 milliseconds. Review recorded waits before publishing. If waits are consistently excessive, try another client or assistant; Razor bundled with the Angel Island Launcher has generally been responsive.

Sheet Music

Sheet Music lets composers transcribe compositions into saleable sheet music. Creating sheet music is also the first step toward adding a song to the Music Box.

Music Box

File:Musicbox1.png
Music Box

The Music Box is a luxury music player for homeowners. It supports spoken commands and lets players sample, purchase, and enjoy compositions by other musicians.

Advanced Composition: Sections and Repeats

Sections and repeats let you write a musical passage once and reuse it throughout a composition. They are especially helpful for verses, choruses, accompaniment, and songs approaching the 100-page composition-book limit.

Section markers are comment lines in the composition book. Razor and ordinary [play commands ignore them, so the musical lines remain Razor-compatible. AIMS expands the arrangement before previewing or transcription.

Named Sections

A normal section plays where it is written. You can play it again later by name:

# Section: Chorus
say '[play c 0.3 e 0.3 g 0.3 c 0.5'
# End
# Play: Chorus
# Play: Chorus x3

Here the chorus plays once at its definition, once at the first # Play, and three more times at the second # Play.

Silent Sections

A silent section defines material without playing it at that location. It plays only when called:

# Silent Section: Chords
say '[play -e -a -cs 0.44 -e -a -cs 0.28'
say '[play -e -a csl 0.28 -ds -gs -b 0.29'
# End
# Play: Chords

Simple Repeats

Use a repeat when you do not need a reusable name:

# Repeat from here
say '[play c 0.2 d 0.2 e 0.2 f 0.2'
say '[play g 0.2 a 0.2 b 0.2 c 0.5'
# Repeat x3

The count is the total number of performances, including the first. Thus x1 plays once, x2 twice, and x3 three times.

Syntax Reference

Marker Meaning
# Section: Name Begins a named passage that plays here and may be called later.
# Silent Section: Name Defines a passage that plays only when called.
# End Closes the current section.
# End: Name Closes the named section; mismatched names are errors.
# Play: Name Plays a previously defined, closed section once.
# Play: Name x3 Plays it three times here.
# Repeat from here Marks the start of a repeat.
# Repeat x3 Ends the repeat and plays its contents three times in total.

Putting It Together

This example uses a silent accompaniment inside a verse and repeats the verse:

# Song: Example
# Author: Galois
# Instrument: LapHarp
# Silent Section: Chords
say '[play -e -a -cs 0.44 -e -a -cs 0.28'
say '[play -e -a csl 0.28 -ds -gs -b 0.29'
# End
# Section: Verse
say '[play -ds -b 0.14 fs 0.14 -fsh 0.14'
# Play: Chords
# End
# Repeat from here
# Play: Verse
# Repeat x2
# Play: Chords x2

The verse plays once at its definition, twice more inside the repeat, and the chords play twice at the end.

For first and second endings, define the shared passage as a silent section, play it, write the first ending, play it again, and write the second ending:

# Silent Section: Theme
say '[play c 0.3 e 0.3 g 0.3'
# End
# Play: Theme
say '[play a 0.3 g 0.5'
# Play: Theme
say '[play f 0.3 c 0.5'

Rules and Limits

  • Commands are case-insensitive, and spacing is flexible: #play:Chorus x2 and # Play: CHORUS both work.
  • Section names may contain spaces, must be unique, and must not contain the word "loop".
  • Define and close a section before using # Play on it.
  • Sections and repeats may be nested, including sections that play other sections, up to eight levels deep.
  • Repeat counts range from x1 to x99.
  • Each marker must occupy its own line; do not append one to a say line.
  • Unrecognized # lines remain comments, such as # Verse 1, # Play softly here, and # End of verse.
  • Existing header settings such as # Song:, # Author:, and # Instrument: continue to work.
  • A reused section includes all its contents: musical lines, waits, lyrics, and comments.

Preview Without Using Paper

To hear a composition before transcribing it:

  1. Enter [play preview.
  2. Target the composition book in your backpack.
  3. Enter [play preview again to stop.

Preview plays the expanded arrangement just as sheet music would, without consuming manuscript paper. While a preview is active, other [play commands explain how to stop it. On shards with book context menus, single-click the book and choose Start Preview; while playing, choose Stop Preview.

Transcribing and Troubleshooting

Transcription still works as before: double-click manuscript paper and target your composition book. AIMS expands sections and repeats into the full arrangement on the resulting sheet. The compact composition and the same music written out in full have the same song identity (hash). Older books without section markers continue to transcribe normally.

If AIMS finds a structural mistake, transcription stops without consuming the paper. Up to five errors appear in red, followed by a count of any remaining errors. Messages identify the page and line and may suggest a correction:

page 37: '# Play: Brige' - no section named "Brige" (did you mean "Bridge"?)

The checks include unknown or duplicate sections, missing or mismatched endings, unmatched repeats, sections played before being closed, self-references, invalid counts, malformed marker placement, and excessive nesting.

Player Settings and Commands

The [play command also configures instruments, timing, volume, and performance behavior.

[play Config

Displays the current player settings.

[play Instrument

Select Harp, LapHarp, or Lute. Default: Harp.

[play instrument harp
[play instrument lapharp
[play instrument lute

[play Timer

Choose Classic, Dynamic, or Anchored:

[play timer anchored

A composition book can also declare its timer in the header:

# Timer: Anchored

Classic

Classic is the original Angel Island timer (2006). It uses a fixed 100-millisecond tick. Notes written together play sequentially, giving a strummed rather than simultaneous-chord effect. Pauses are rounded to 100 milliseconds. Classic is suitable for simple melodies, manual play, and older compositions. It ignores Tempo and Prefetch.

[play timer classic
# Timer: Classic

Dynamic

Dynamic (2022) schedules notes using millisecond-based delays, supporting true chords and more detailed rhythms. Tempo specifies the default spacing between successive notes in milliseconds (default 100). Prefetch controls how explicit pauses interact with that spacing: with Tempo 100 and a pause of 500 milliseconds, Prefetch False gives 600 milliseconds between notes, while Prefetch True gives 500.

# Timer: Dynamic
# Prefetch: True
# Tempo: 0

Because Dynamic schedules relative to the previous note's actual playback time, small delays can accumulate in longer pieces. Testing has shown drift approaching 10% in some cases.

Anchored

Anchored supports Dynamic-style chords, Tempo, and Prefetch, but schedules notes relative to the composition's start. This reduces accumulated timing drift. After a server interruption such as a world save, it adjusts its timing reference rather than releasing a burst of overdue notes. Anchored is a good choice for long, rhythmically complex pieces.

# Timer: Anchored
# Prefetch: True
# Tempo: 0

Existing Dynamic pieces can generally use Anchored without rewriting their notes or pauses.

Timing Mode Comparison

Feature Classic Dynamic Anchored
Resolution 100 ms tick Millisecond-based Millisecond-based
True chords No Yes Yes
Tempo / Prefetch Ignored Supported Supported
Timing drift Fixed-tick behavior Can accumulate Minimized
Best for Simple and legacy music Detailed arrangements Detailed arrangements with stable tempo

Compatibility

Legacy NewTimer settings remain supported:

# NewTimer: False
# NewTimer: True
[play newtimer false
[play newtimer true

NewTimer False corresponds to Classic; NewTimer True corresponds to Dynamic. If both Timer and NewTimer headers are present, Timer wins. Without an explicit timer setting, songs default to Classic.

[play Prefetch

Use with Dynamic or Anchored (not Classic):

[play prefetch true

When enabled, an explicit pause replaces rather than adds to the default Tempo interval. Default: False. Older compositions may need pause adjustments when switching modes. See Advanced Usage.

[play Tempo

Tempo controls the default spacing between notes in milliseconds for Dynamic and Anchored.

[play tempo 100

At 50, the default interval is half as long as at 100; at 200 it is twice as long. Changing Tempo after composing may require adjusting explicit pauses. Default: 100.

[play Reset

Resets the player to its defaults: Harp, Classic (NewTimer False), Prefetch False, Tempo 100.

[play + (Sound Effects)

With at least 1,000 Music Karma, musicians can use sound IDs from the game client:

[play +480

Here +480 is the sound associated with targeting the Cure spell. See Sound List.

[play Chatter

[play chatter true

Enables or disables the *Plays a tune* emote. Default: False.

[play ConcertMode

[play ConcertMode True

Allows nearby listeners to hear the volume levels set by the musician regardless of distance. Default: False.

[FilterMusic

Toggles whether composition music plays on your client; it does not silence music for others.

[StopMusic

Stops your character's [play performance immediately.

Volume, Music Karma and Composer Titles

Volume

Place vN before a note or group of notes to change volume. The original examples demonstrate volume steps with macros:

[play macro part1=v0 1 a v1 1 a v2 1 a v3 1 a v4 1 a v5 1 a v6 1 a v7 1 a
[play macro part2=v8 1 a v9 1 a v10 1 a v11 1 a v12 1 a v13 1 a v14 1 a v15 1 a v16 1 a
[play macro part3=v17 1 a v18 1 a v19 1 a v20 1 a v21 1 a v22 1 a v23 1 a v24 1 a
[play macro part4=v25 1 a v26 1 a v27 1 a v28 1 a v29 1 a v30 1 a v31 1 a v32 1 a
[play %part1% %part2% %part3% %part4%

Enable [play ConcertMode True if you want other listeners to hear these volume differences; otherwise their playback uses the normal distance-based volume.

Music Karma

Musicians earn Music Karma through publishing and selling compositions. At 1,000 Music Karma, they may use non-musical sounds from the game client with [play. An approved composition added to the Music Box global repository earns 100 points, and each purchase earns another 100 points. See Sound List.

Composer Titles

Join the NPC Bards Guild to work toward the Composer profession title, progressing from Neophyte to Grandmaster. Progress comes from publishing, sales, plays, and use of [play, with bonuses for advanced features. [play usage counts only after joining the guild; publishing, plays, and sales before joining are credited when you join. Published works can also earn ordinary Karma and Fame.

Algebraic Macros

Macros let you name a note sequence, reuse it, transpose it, reverse it, or change its pauses. Unlike sections, macros transform note patterns; sections reuse complete passages, including waits and lyrics.

Defining and Playing a Macro

[play macro bassline = cl 0.2 e 0.2 g 0.2 a
[play %bassline%
[play instrument harp
[play %bassline% 0.2 %bassline%

Transposing

[play %bassline[+5]%

This transposes five half-steps upward (a perfect fourth):

[play f 0.2 a 0.2 c 0.2 dh

Use [+n] or [-n]. Notes outside the supported cl-to-ch range are dropped.

Reversing

[play %-bassline%

This reverses the sequence:

[play a 0.2 g 0.2 e 0.2 cl

For example, a blues-style pattern can combine original and reversed macros:

[play %bassline% 0.2 as 0.2 %-bassline%
[play %bassline% 0.2 as 0.2 %-bassline%
[play %bassline[+5]% 0.2 dsh 0.2 %-bassline[+5]%
[play %bassline% 0.2 as 0.2 %-bassline%
[play %bassline[+7]% 0.2 %bassline[+5]% 0.2
[play %bassline% 0.2 as 0.2 %-bassline%

Changing Pauses

[play %bassline<+0.1>%

Adds 0.1 second to every pause, producing:

[play cl 0.3 e 0.3 g 0.3 a

The arithmetic operators can be combined with a macro:

Expression Resulting pauses
%bassline% 0.2
%bassline<+0.01>% 0.21
%bassline<-0.01>% 0.19
%bassline<*2>% 0.4
%bassline</2>% 0.1

Combining Operations

Define minor and major arpeggios:

[play macro min = cl 0.1 ds 0.1 g 0.1 c
[play macro maj = cl 0.1 e 0.1 g 0.1 c

Then transpose, reverse, and change their pacing in the same expression:

[play %min[+2]</2>% 0.2 %-min[+2]</2>% 0.8
[play %min[+2]</2>% 0.2 %-min[+2]</2>% 0.1 e 0.1 f 0.1 g 0.1 a 0.8
[play %maj[+5]</2>% 0.2 fh 0.05 eh 0.05 c 0.05 a 0.8
[play %min[+2]</2>% 0.2 %-min[+2]</2>% 0.8

Or a Pachelbel-inspired progression:

[play %maj[+12]<2>% 0.2 %maj[+7]<2>% 0.2 %min[+9]<2>% 0.2 %min[+4]<2>% 0.2
[play %maj[+5]<2>% 0.2 %maj<2>% 0.2 %maj[+5]<2>% 0.2 %maj[+7]<2>%

Many thanks to Galois for contributing the algebraic macros material.

Sample Tunes

Twinkle Twinkle Little Star

In Razor, add a two-second pause after the third line and a four-second pause before the last line.

[play cl 0.4 cl 0.4 g 0.4 g 0.4 a 0.4 a 0.4 g 0.8
[play f 0.4 f 0.4 e 0.4 e 0.4 d 0.4 d 0.4 cl 0.8
[play g 0.4 g 0.4 f 0.4 f 0.4 e 0.4 e 0.4 d 0.8
[play g 0.4 g 0.4 f 0.4 f 0.4 e 0.4 e 0.4 d 0.8
[play cl 0.4 cl 0.4 g 0.4 g 0.4 a 0.4 a 0.4 g 0.8
[play f 0.4 f 0.4 e 0.4 e 0.4 d 0.4 d 0.4 cl 0.8

Frère Jacques

In Razor, add a one-second pause between the second and third lines.

[play c 0.3 dh 0.3 eh 0.3 c 0.4 c 0.3 dh 0.3 eh 0.3 c 0.3
[play eh 0.3 fh 0.3 gh 1.0 eh 0.3 fh 0.3 gh 1.0 gh 0.1 ah 0.1 gh 0.1 fh 0.1 eh 0.3 c 0.3
[play gh 0.1 ah 0.1 gh 0.1 fh 0.1 eh 0.3 c 0.4 c 0.3 g 0.3 c 1.0 c 0.3 g 0.3 c

Pop Goes the Weasel

[play d 0.2 g 0.6 g 0.2 a 0.6 a 0.2 b 0.2 dh 0.2 b 0.2 g 0.6
[play d 0.2 g 0.6 g 0.2 a 0.6 c 0.2 b 0.8 g 0.6
[play d 0.2 g 0.6 g 0.2 a 0.6 a 0.2 b 0.2 dh 0.2 b 0.2 g 0.8
[play eh 0.8 a 0.4 c 0.2 b 0.8 g

Advanced Usage

The following technical observations and examples were contributed by Galois. They describe the behavior of the Dynamic/NewTimer system and are useful for understanding timing choices.

Understanding Prefetch and NewTimer

Consider:

[play cl 0.1 d 0.1 e
File:Musicbox14.png
Timing illustration

Tempo determines the default note spacing. Prefetch controls whether an explicit pause begins without adding the default delay. Thus you can play closely spaced notes with Prefetch enabled:

[play cl 0.01 d 0.01 e 0.01 f 0.01 g

With Prefetch disabled, negative pauses can also request prefetch-style spacing:

[play cl -0.01 d -0.01 e -0.01 f -0.01 g

These tools help tune precise rhythms such as three notes against two. If no pause is specified (for example, [play cl d e), Prefetch has no effect on that interval.

Repeating Notes

The client has a limitation when replaying the same sound file rapidly. A repeated note may be ignored while its previous sound is still playing. Sound durations vary by instrument; lute notes can generally be repeated faster than standing-harp notes. Switching instruments can sometimes help because the client then plays a different sound file, provided the desired note exists in both registers.

Using Multiple Instruments

This example combines a standing-harp accompaniment with lap-harp melody, inspired by Chariots of Fire:

say '[play newtimer true'
say '[play prefetch false'
say '[play tempo 90'
say '[play instrument harp'
say '[play csl 0.1 csl 0.1 csl 0.1 csl 0.1'
wait 800
say '[play csl 0.1 csl 0.1 csl -0.01 +cs 0.1 csl 0.1'
wait 800
# Note 3 against 2 rhythm
say '[play csl -0.01 +fsh 0.08 csl -0.07 +gsh -0.15 csl -0.15 +ash -0.07 csl 0.1'
wait 800
say '[play csl -0.01 +gsh 0.08 csl 0.1 csl 0.1 csl 0.1'
wait 800
say '[play csl -0.01 +fh 0.08 csl 0.1 csl 0.1 csl 0.1'

Case Study: A Three-Over-Two Rhythm

Galois first chose Tempo 90 with 0.1-second pauses for the desired accompaniment feel. To estimate the effective timing interval, he compared:

[play cl 0.1 cl 0.1 cl 0.1 cl 0.1 g 0.3 g 0.3 cl 0.1 cl 0.1 cl 0.1 cl 0.1 g 0.3 g 0.3

With a more closely matched rhythm:

[play cl 0.1 cl 0.1 cl 0.1 cl 0.1 g 0.34 g 0.34 cl 0.1 cl 0.1 cl 0.1 cl 0.1 g 0.34 g 0.34

The timing relationship was:

2 * (0.01 + x + 0.1) = 0.01 + x + 0.34

This suggested an effective interval component of about 0.13 seconds at that tempo. Four eighth-note intervals then total:

4 * (0.01 + 0.13 + 0.10) = 0.96 seconds

Dividing this into three yields 0.32 seconds per triplet. The bassline falls at 0.00, 0.24, 0.48, 0.72, and 0.96 seconds, while the triplets fall at 0.00, 0.32, and 0.64 seconds.