[abc standard: home | current | route-map | updating | proposals]

This is an old revision of the document!

## Transposition proposal - summary

This page contains the eleventh draft of a proposal to extend the transcription capabilities within abc. It involves only minor changes from the tenth draft:

• Minor change of syntax from `instrument=<note>` / `written=<note>` to `instrument=<note>;abc=concert` / `instrument=<note>;abc=written`
• New `I:shift-score`, `I:shift-sound` and `I:shift` instruction fields so that transpositions can be applied to a whole file.
• A new `+` parameter so that `shift*` changes can be combined.

The important aspects of this proposal are the same as version 10:

• A single system for transposition (rather than the dual high/low-level systems proposed previously) consisting of the well-establised `shift-score` and `shift-sound` operators which allow the typeset score and playback to be modified independently
• transposition by interval (e.g. C to G), rather than by semitones as previously
• `instrument` alternatives for `shift-score` and `shift-sound`, to give an intuitive specification for transposing instruments
• `shift` shorthand for combined score and sound transpositions

I have included some notes and comments at the end.

### 4.6 Clefs and key/voice parameters

Additional text for section 4.6 Clefs and transposition

This section discusses support within abc for clefs and other features which affect the placement of the notes relative to the staff. It briefly mentions transposition, because the relevant syntax appears in the `K:key` and `V:voice` fields, but this topic is discussed in full in section 13, Transposition.

Clef, transposing instrument and related indications appear as modifiers to the `K:key` and `V:voice` fields; the possible modifiers are:

```[clef=]<clef name>[<line number>][+8|-8] stafflines=<lines> octave=<number>
shift-score=[+]<note1><note2> shift-sound=[+]<note1><note2>
shift=[+]<note1><note2> instrument=<note>;[abc=]concert|written```

(where `<…>` denotes a value, `[…]` denotes an optional parameter, and `|` separates alternative values).

Within a given voice, the modifiers of each `K:` or `V:` field are inherited from the previous `K:` or `V:` field, unless overriden - see scope and inheritance of modifiers for more details.

… unchanged …

• `shift-score=[+]<note1><note2>` transposes the typeset score according to the specified interval (the playback is not affected) - for more information see transposition operators;
• `shift-sound=[+]<note1><note2>` transposes the playback according to the specified interval (the typeset score is not affected) - for more information see transposition operators;
• `shift=[+}<note1><note2>` is a shorthand for `shift-score=[+}<note1><note2> shift-sound=[+}<note1><note2>` - for more information see transposition operators;
• `instrument=<note>;abc=concert` is a alternative for `shift-score=<note>c` - for more information see writing abc code for transposing instruments;
• `instrument=<note>;abc=written` is a alternative for `shift-sound=c<note>` - for more information see writing abc code for transposing instruments;

… unchanged …

Note:

• The `transpose=<semitones>` modifier of abc 2.1 and earlier is now deprecated (replaced by the `shift-sound` modifier - see transposition).
• The `middle=<pitch>` modifier of abc 2.0 and earlier has been compromised in terms of what it was supposed to do and how it has actually been implemented. It is therefore deprecated.

TODO: Update deprecated list.

… unchanged …

#### 4.6.1 Scope and inheritance of modifiers

As a fundamental rule, within each voice, each successive `V:` or `K:` field inherits the modifiers of the previous `V:` or `K:` field, unless it specifically overrides them.

Note: in other words, within a voice `V:` inherits from a `K:` field as well as from another `V:` field (and vice-versa).

Recommendation: In single-voice tunes these modifiers will normally be applied to the `K:` field. In multi-voice tunes it is recommended that they are only applied to `V:` fields (an additional `V:` field can even be introduced if one of the modifiers needs to change at a `K:` change). If a single-voice tune contains `V:` fields (for example, if it is a part extracted from a multi-voice score), then it is recommended that modifiers are applied to the `V:` fields.

For each `K:` or `V:` field, modifiers may be arranged in any order but there should be no more than one of each modifier in the same field.

If there are inherited or repeated modifiers, then the second overrides the first. In the specific case of `shift-score` or `shift-sound` modifiers mixed together with `shift`, `instrument` or `written` modifiers, replace the latter with their `shift-score` and `shift-sound` equivalents. For example, `shift=CG shift-score=CD` becomes `shift-score=CG shift-sound=CG shift-score=CD` and so the second `shift-score` overrides the first to give `shift-sound=CG shift-score=CD`.

An exception to the overriding rule is that if `shift-score`, `shift-sound` or `shift` is written with a `+` symbol, e.g. as `shift=+<note1><note2>`, then the transposition is combined with preceding transposition modifiers in the same field, rather than overriding them. See transposing a file for an example of when this would be useful.

Finally note that there are two ways to specify octave shifts and, for example, `octave=1` is equivalent to `shift=Cc`. However these operators can be used independently and so neither overrides the other.

## 13 Transposition

### 13.1 Transposition operators

The fundamental transposition operators are `shift-sound` and `shift-score` which act as modifiers for `K:key` and `V:voice` fields:

• `shift-score=[+]<note1><note2>` transposes the typeset score according to the specified interval (the playback is not affected)
• `shift-sound=[+]<note1><note2>` transposes the playback according to the specified interval (the typeset score is not affected)

When using `shift-score` and `shift-sound`, the transposition interval is specified by two notes, `<note1><note2>`. Here `<note1>` refers to the transcribed abc code and `<note2>` refers to the rendered output (i.e. the typeset score in the case of `shift-score` or the playback in the case of `shift-sound`).

Example: In the following the typeset score is raised by a fifth and is rendered the same as if the abc code was transcribed as `[K:D] efga`. The playback is lowered by a tone and is rendered the same as if the abc code were `[K:F] GABc`.

```K:G shift-score=CG shift-sound=DC
ABcd```

To specify the same transposition for both score and sound, just use `shift=<note1><note2>` as a shorthand.

Example: The following two `K:key` fields are equivalent

```K:G shift-score=CG shift-sound=CG
K:G shift=CG```

The optional `+` symbol (e.g. `shift=+<note1><note2>`) has the effect of combining with, rather than overriding, existing transposition and is mainly intended for use with whole file transpositions - see transposing a file. Combining shifts are never inherited by subsequent `K:` and `V:` fields - instead the combined shift is inherited.

Example: The following two excerpts are equivalent. In the former, the `shift` modifiers for the first `V:` field combine to give `shift=CG` which is then inherited by the second `V:` field (since it is in the same voice); it is also inherited by the third `V:` field, but is overridden. The latter excerpt just includes the `shift` explicitly for comparison.

```V:1 shift=CD shift=+DG
V:1
V:1 shift=CD

V:1 shift=CG
V:1 shift=CG
V:1 shift=CD```

All shift transposition are applied to notes, grace notes, chords and key signatures.

Note: The interval system is clear with regard to enharmonics so, for example, the interval `C` to `_G` is distinct from `C` to `^F`. However, to compute transpositions it may be helpful to use the MusicXML concept of specifying the interval as a combination of diatonic steps and semitones. Both of these can be easily calculated and make it simple to work out what the resulting note is using the diatonic steps to give the letter and the semitones to indicate whether it is flat, natural or sharp.

Examples: `C` to `^F` is 6 semitones in 3 diatonic steps - C to D, D to E, E to F (as opposed to `C` to `_G` which is 6 semitones in 4 diatonic steps). Using this interval:

• Eb (`_E` in abc code) transposes to A since A is 3 steps (letters) above E (in the cycle ABCDEFG) and the A is natural, since that note is 6 semitones above Eb
• G transposes to C# (`^c` in abc code) since C is 3 steps above G and C# is 6 semitones above G
• C# transposes to F## (`^^F` in abc code) since F is 3 steps above C and F## is 6 semitones above C#

Notes for developers: You should correct any transposition which goes beyond the specified abc limits to available key signatures, `K:Cb` (7 flats) to `K:C#` (7 sharps), and double/triple accidentals. For example, in principle `K:C# shift-score=CG` raises the key up to `K:G#` (8 sharps), so to keep with the limits it should be rendered as `K:Ab` (4 flats).

TODO (elsewhere in the standard): Limit the range of key signatures supported by abc to `K:Cb` (7 flats) through to `K:C#` (7 sharps). (Also limit accidentals - e.g. double sharp and double flat accidentals should be supported, but triples are entirely optional.)

### 13.2 Writing abc code for transposing instruments

Transposing instruments sound notes at a different pitch to which they are written. For example, a C written on a Bb clarinet score would be sounded as a Bb (and similarly a written D would be sounded as a C).

This section uses written pitch (i.e. the pitch that is written on a transposing instrument's score) and concert pitch (i.e. the pitch that is actually sounded) to distinguish between the two.

Note: The term "concert pitch" is also used elsewhere in the musical lexicon to indicate "play A (above middle C) at 440Hz". However, here it refers to the pitches that transposing instruments actually sound.

There are two ways of writing abc code for transposing instruments:

1. The abc code can be transcribed at concert pitch with `shift-score=<note1><note2>` modifiers used to transpose the typeset scores appropriately. If preferred the `instrument=<note>;abc=concert` modifier can be used as a alternative for `shift-score=<note>c`. Here the `abc=` is optional so this could be written `instrument=<note>;concert`.
2. The abc code can be transcribed at written pitch with `shift-sound=<note1><note2>` modifiers used to transpose the playback appropriately. If preferred the `instrument=<note>;abc=written` modifier can be used as a alternative for `shift-sound=c<note>`. Again the `abc=` is optional so this could be written `instrument=<note>;written`.

In both cases the typeset score is rendered at written pitch by default.

If a concert pitch score is required the `I:concert-score` instruction can be applied, either in the file header or the tune header. For transcriptions at concert pitch this has the effect of cancelling all of the `shift-score` modifiers (and the `instrument=<note>;abc=concert` alternative). For transcriptions at written pitch it has the effect of altering `shift-sound` modifiers (and the `instrument=<note>;abc=written` alternative) to `shift` modifiers.

Note: The `<note>` in the `instrument=<note>` syntax is a note and not a key (so that different octaves may be specified and so that the letter `b` is not ambiguous). Therefore, for a Bb instrument you must write `instrument=_B` and not `instrument=Bb`.

The following example illustrates the principles of writing for transposing instruments.

#### 13.2.1 Transposing instruments - extended example

Suppose a Bb clarinet player and a violinist wish to play the same piece which simply consists of the notes CDEF in the key of C.

Since the violin is not a transposing instrument, the violinist's part is written (and sounded):

```V:violin
K:C
CDEF|```

For the clarinet part, there is a choice. If, say, the composer of the piece prefers to work at concert pitch, the clarinet part can be transcribed as sounded, either using `shift-score`:

```V:clarinet shift-score=_Bc
K:C
CDEF|```

or using `instrument` as a alternative:

```V:clarinet instrument=_B;abc=concert
K:C
CDEF|```

This will be rendered by abc typesetting software according to the shift (i.e. `[K:D] DEFG`) but sounded as transcribed (i.e. `CDEF`). If a concert pitch score is required it can be typeset by adding an `I:concert-score` instruction.

Alternatively, if the composer wants the abc code at written pitch, the same piece can be transcribed:

```V:clarinet shift-sound=c_B
K:D
DEFG|```

or using `instrument` as a alternative:

```V:clarinet instrument=_B;abc=written
K:D
DEFG|```

This will be rendered by abc typesetting software as transcribed (`DEFG`) but sounded according to the shift (i.e. `CDEF`). Again, if a concert pitch score is required it can be typeset by adding an `I:concert-score` instruction.

Note: Written pitch voices will almost always need their own `K:` field to set the key correctly (which will be different from concert pitch voices).

The whole piece could then be transcribed at concert pitch as:

```K:C
V:violin
CDEF|
V:clarinet instrument=_B;abc=concert
CDEF|```

or at written pitch as:

```K:C
V:violin
CDEF|
V:clarinet instrument=_B;abc=written
K:D
DEFG|```

In either case the typeset score will be rendered at written pitch (and the playback at concert pitch). To obtain a concert pitch score, add an `I:concert-pitch` instruction in the file or tune header.

Re-transposition: Finally, suppose that the clarinet player has fallen ill and is to be replaced by an alto sax player who now needs a transposed part to read. If the abc code has been transcribed at concert pitch this is extremely easy by replacing `instrument=_B;abc=concert` with `instrument=_E;abc=concert`.

```K:C
V:violin
CDEF|
V:alto-sax instrument=_E;abc=concert
CDEF|```

If the abc code has been transposed at written pitch (in this case for a Bb instrument) it is a little harder.

The `instrument=_B;abc=written` can remain, as it is adjusting the playback to concert and also will serve as a reminder that the part was originally transcribed at written pitch for a Bb instrument.

To adjust the score, consider that the Bb clarinet is written a major second higher than it is sounded (so C is written D) whereas the alto sax is written a major sixth higher than it is sounded (so C is written A). Since the abc code is already transcribed a tone higher, it needs to be raised by a further fifth (i.e. a major sixth less a major second) using `shift-score=CG` (or `shift-score=DA` if that is easier to think about). The resulting code is

```K:C
V:violin
CDEF|
V:alto-sax instrument=_B;abc=written shift-score=CG
K:D
DEFG|```

This final example suggests that, all other things being equal, it is rather more flexible to transcribe the abc code at concert pitch rather than at written pitch.

#### 13.2.1 Transposing instrument examples

The following table lists some example transposing instruments and the modifiers they would need

abc at concert pitch abc at written pitch
Instrument `shift-score` `shift-sound` `instrument`
piccolo `shift-score=c'c` `shift-sound=cc' ` `instrument=c' `
Bb clarinet `shift-score=_Bc` `shift-sound=c_B ` `instrument=_B`
soprano sax `shift-score=_Bc` `shift-sound=c_B ` `instrument=_B`
A clarinet `shift-score=Ac` `shift-sound=cA` `instrument=A`
alto flute `shift-score=Gc` `shift-sound=cG` `instrument=G`
cor anglais `shift-score=Fc` `shift-sound=cF` `instrument=F`
alto sax `shift-score=_Ec` `shift-sound=c_E` `instrument=_E`
tenor sax `shift-score=_B,c` `shift-sound=c_B,` `instrument=_B,`

### 13.3 Transposing a file

To transpose an entire file, use the instruction `I:shift-score <note1><note2>`, `I:shift-sound <note1><note2>` or, as a shorthand for both, `I:shift <note1><note2>`. When placed in the file (or tune) header they have the the effect of applying the corresponding `shift-score=`, `shift-sound=` or `shift=` modifiers to every `K:` and `V:` field in the file (tune).

Note that this will cancel out any existing transposition.

Example: The following excerpts are equivalent; in the former the `I:shift-score cC` (downwards octave transposition) is applied to the `K:` field and overrides the existing `shift-score` modifier to give the latter.

```I:shift-score cC
K:C shift-score=_Bc
CCCC|```
```K:C shift-score=cC
CCCC|```

If it is desired to retain existing transpositions, so that the result is a combination of the instruction and any existing transposition modifiers, use the `+` form: `I:shift-score +<note1><note2>`, `I:shift-sound +<note1><note2>` or `I:shift +<note1><note2>`.

Example: The following excerpts are equivalent; in the former the `I:shift-score +cC` (downwards octave transposition) is applied to the `K:` field and combines with the existing `shift-score` modifier to give the latter.

```I:shift-score +cC
K:C shift-score=_Bc
CCCC|```
```K:C shift-score=_BC
CCCC|```

## Notes and comments on the proposal

I welcome comments on all of the above proposal but in particular:

• After suggestions on the tenth proposal I have made the transposing instrument modifiers much more explicit - i.e. `instrument=<note>;abc=concert` and `instrument=<note>;abc=written`. A number of other suggestions have been made for the qualifier which specifies whether the abc encoded at concert or written pitch including the following (I don't really mind which we end up with):
• `concert-encoded` / `written-encoded` - a little more verbose
• `concert` / `written` - perhaps a little too terse and open to being misinterpreted by a user as relating to the typeset score (although this proposal does allow for these as shorthand)
• `abcAsSound` / `abcAsScore` - personally I don't find these very intuitive (particularly because it means that `instrument=<note>;abcAsScore` is an alternative for `shift-sound=c<note>` and vice-versa, and also because `abcAsScore` really means `abcAsWrittenScore`, since the score can either be typeset at concert or written pitch)
• One mechanism missing from the proposal is allowing provision for clefs which change between a concert pitch score its written pitch counterpart. However, since transposing instruments are always typeset at written pitch (except when `I:concert-score` is present), that means we just need something like `concert-clef=treble` (which would only apply when `I:concert-score` is present) to handle this.

A recurring question is whether independent `shift-score` and `shift-sound` modifiers are actually necessary. I have discussed this separately in the independent-shift use-case.

The other question that has arisen is whether the `instrument` modifier should be instructive or declarative (i.e. instructing abc software to do something as opposed to declaring some information which the software can act on if another instruction, such as "create a written pitch score", is present). The argument for the latter is that the English syntax is declarative (since instrument is a noun rather than a verb).

I have now come to think of the crux of the question as whether the abc syntax should be active or declarative - active meaning that any change to the abc code (particularly in the tune body) will result in a change to the way it is interpreted (either by a program or a human).

I prefer active syntax for two reasons:

1. Active syntax is generally simpler; declarative syntax means that you have different operators, potentially in very different parts of the file (e.g. some in `I:` fields and some as `K:` and `V:` modifiers) which can combine to affect the output.
2. The `K:` and `V:` fields already have several well-established active modifiers (`clef`, `middle` and `octave`) which affect the placement of the notes relative to the staff. Including new declarative modifiers alongside them will result in a mixture of the two which would be very confusing for users (who by now are used to making changes to an abc and seeing those changes reflected in the score).

Chris Walshaw, June 2014
{"ft_lang_label":"__label__en","ft_lang_prob":0.87044674,"math_prob":0.6926223,"size":18272,"snap":"2021-04-2021-17","text_gpt3_token_len":4427,"char_repetition_ratio":0.18376397,"word_repetition_ratio":0.07705966,"special_character_ratio":0.22011821,"punctuation_ratio":0.10838562,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.9564167,"pos_list":[0,1,2],"im_url_duplicate_count":[null,null,null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2021-01-23T17:49:25Z\",\"WARC-Record-ID\":\"<urn:uuid:3c68988e-6ed8-40c2-bee1-d3cbefefaa16>\",\"Content-Length\":\"41724\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:3b5a7032-1080-43ce-8da2-5ff344ca3068>\",\"WARC-Concurrent-To\":\"<urn:uuid:cd0715b8-7b3f-4edc-ae4b-3401c22b4e51>\",\"WARC-IP-Address\":\"162.253.125.192\",\"WARC-Target-URI\":\"http://abcnotation.com/wiki/abc:standard:v2.1:proposals:transposition:v11?rev=1403085055\",\"WARC-Payload-Digest\":\"sha1:XMCW7B2OGY6XZJCBNA2NTZUVRUE2HLDI\",\"WARC-Block-Digest\":\"sha1:TZ742BK7O2ICYABDIEOYE53JPNN52T57\",\"WARC-Identified-Payload-Type\":\"application/xhtml+xml\",\"warc_filename\":\"/cc_download/warc_2021/CC-MAIN-2021-04/CC-MAIN-2021-04_segments_1610703538226.66_warc_CC-MAIN-20210123160717-20210123190717-00666.warc.gz\"}"}