Skips and Steps and Style

This module explores the prevalence of melodic skips and styles in different styles of music. It builds directly on the techniques covered in the Skips and Steps module.

In the previous module, we established that melodic steps are significantly more prevalent than skips in the Kyrie of the Pope Marcellus Mass:

While in the previous module we used two separate for loops to calculate the number of skips and steps, we can easily combine these two processes into a single loop:

from music21 import *

kyrie = converter.parse('/Users/username/Downloads/GPPal_MPM_01_Kyrie.mxl')

tenor =['Tenore I']

intervals = tenor.melodicIntervals()

skips = 0
steps = 0

for i in intervals:
 if abs(i.semitones) > 2:
  skips = skips + 1
 elif (abs(i.semitones) > 0) and (abs(i.semitones) < 3):
  steps = steps + 1

>>> skips
>>> steps

In this module, we want to compare the prevalence of skips and steps in examples of different styles. Since we’re looking at the same musical properties of each example, we can generate a function that will use the same method on each and output the values automatically:

def count_skipstep(melody):
 intervals = melody.melodicIntervals()
 skips = 0
 steps = 0
 for i in intervals:
  if abs(i.semitones) > 2:
   skips = skips + 1
  elif (abs(i.semitones) > 0) and (abs(i.semitones) < 3):
   steps = steps + 1
 print("Steps:", steps)
 print("Skips:", skips)

> Steps: 128
> Skips: 40

The strong preference for steps over skips is typical of Renaissance vocal compositions such as this. Vocal music in general shows a preference for steps because skips can be very difficult to sing. Vocal music that emphasizes melodic skips is usually reserved for high skilled soloists, such as opera singers.

Let’s compare this example with an instrumental example from the Classical period. We’ll use the first movement (0:00-2:25) of Joseph Haydn’s first string quartet:

We can import this movement directly from the music21 corpus:

haydn = corpus.parse('haydn/opus1no1/movement1.mxl')

In Haydn’s string quartets, the first violin typically has the majority of the melodic material, so let’s focus on that part:

first_violin =['Violin I']

Now we apply our function:

> Steps: 84
> Skips: 142

It seems that in this string quartet, the number of skips is significantly higher than the number of steps. In general, executing melodic skips is easier for instrumentalists than vocalists, though there are exceptions.

Let’s take a look at one final composition, this time from around the turn of the twentieth century. This is a composition called Maple Leaf Rag for solo piano by Scott Joplin:

Maple Leaf Rag is available through the music21 corpus:

joplin = corpus.parse('joplin/maple_leaf_rag.mxl')

As before, we can extract the top staff, which contains the recognizable aspects of the melody:

top_staff =[0]

And run our function again:

> Steps: 51
> Skips: 305

In Maple Leaf Rag, it’s clear that melodic skips vastly outnumber steps, and by more than in any previous example. It’s worth reflecting on whether there are specific musical or instrumental factors that lead to a preference for skips or steps in different contexts.

This methodology can be made even more precise by taking into account how the presence of chords in the melody affects how intervals are calculated. Curious readers can check out this more advanced module.


  1. How would you calculate the prevalence of skips and steps as a percentage for each?
  2. How would we add the number of repeated notes (interval = 0) to the function?
  3. How do the other parts in Haydn’s string quartet or Joplin’s Rag compare with the parts we chose to look at? Can we make any claims about the prevalence of skips or steps between parts in a single work?
  4. What other styles, time periods, or musical traditions might we compare? On what basis might we predict whether skips or steps will be most prevalent?