Previous topic


Next topic


Table Of Contents

Table Of Contents

This Page


Johannes Ciconia (ca. 1370-1412) was born in Liege, emigrated to Padua, and was one of Italy’s most important composers in the early fifteenth century. Ciconia left us with two canons with enigmatic properties, Le Ray au Soylel, first successfully transcribed by Margaret Bent and Anne Hallmark in Polyphonic Music of the Fourteenth Century, vol. 24, and Quod Jactatur.

Quod Jactatur has never been successfully transcribed. Its canon, “Tenor quem contratenor triplumque fugant temporibus in quinque” and text “Quod Jactatur qui virtus opere non demonstratur / Ut aqua pissis sepius scientia dejugatur” (not “denegatur”) together with the given clefs suggest a resolution in fifths, five breves apart. But none of the transcriptions have seemed successful. Previous scholars seemed to neglect two important aspects of the composition. First that important resting points happen 5 measures from the beginning of the piece, 5 measures from the end of the piece, and at the exact middle: strongly suggesting a retrograde solution where two voices enter at the same time (as the top two voices do in Machaut’s “Ma fin est mon comencement”). Second, that the three clefs are not C5, C3, C1, but C3 followed by C1 and C5 written directly above each other – the importance of this ordering can be seen by closely looking at the manuscript, Modena, Biblioteca Estense, Alpha.5.24, fol. 20v (old fol. 21v), edited recently by Anne Stone. The clefs were originally written as C5 followed by C3 followed by C1, but the scribe erased the first two scribes and rewrote them in the correct order. (The C5 clef was also written as C4 first but changed to C5 later)

Solving this canon seemed a great use of music21, since we could try out different solutions, moving notes over a measure or two, etc. without any problems. Working on this problem also gave a great test of music21’s ability to manipulate diatonic Streams.



the structure of the piece strongly suggests a retrograde solution (e.g., there is a cadence in m5 and five measures from the end and one at the exact center). This method tries all transpositions of one voice vs. the other and gives positive points to intervals of 3, 4, 5, 6, and 8 (incl. tritones, since they might be fixed w/ other voices; 4th is included since there could be a 3rd or 5th below it).


loads Quod Jactatur from the corpus, transposes it to an easy to view range and stores it in the cache.

>>> from music21.trecento import quodJactatur
>>> qj = quodJactatur.getQJ()
>>> qj.flat.notesAndRests[0]
<music21.note.Note C>

returns a number (4, 2, 0.5) depending on if the note is on a downbeat (4), a strong beat (2) or another beat (0.5)

Used for weighing consonance vs. dissonance.

For speed, it uses n.offset not n.beat; more general purpose solutions should use n.beat

music21.trecento.quodJactatur.prepareSolution(triplumTup, ctTup, tenorTup)
music21.trecento.quodJactatur.prependBlankMeasures(myStream, measuresToAppend=1, inPlace=True)

adds one (default) or more blank measures (filled with rests) to be beginning of myStream

>>> from music21.trecento import quodJactatur
>>> qj = quodJactatur.getQJ()
>>> qj.duration.quarterLength
>>> qj.flat.notesAndRests[0]
<music21.note.Note C>
>>> len(qj.getElementsByClass(stream.Measure))
>>> qj2 = quodJactatur.prependBlankMeasures(qj, 10, inPlace = False)
>>> qj2.duration.quarterLength
>>> qj2.flat.notesAndRests[0]
<music21.note.Rest rest>
>>> len(qj2.getElementsByClass(stream.Measure))
music21.trecento.quodJactatur.reverse(self, inPlace=False, classesToMove=(<class 'music21.key.KeySignature'>, <class 'music21.meter.TimeSignature'>, <class 'music21.clef.Clef'>, <class 'music21.metadata.Metadata'>, <class 'music21.instrument.Instrument'>, <class 'music21.layout.SystemLayout'>), makeNotation=False)

synonym: retrograde()

reverse the order of stream members both in the .elements list but also by offset, so that the piece sounds properly backwards. Automatically sorts the stream as well. If inPlace is True (no by default) the elements are reversed in the current stream. if inPlace is False then a new stream is returned.

all elements of class classesToMove get moved to their current end locations before being reversed. This puts the clefs, TimeSignatures, etc. in their proper locations. (THIS DOES NOT YET WORK)

music21.trecento.quodJactatur.transposeStreamDiatonic(myStream, diatonicInterval=1)