I am creating a classical Music song scraper, that takes disparate file names, ascertains its properties, and rewrites their titles in a uniform way and identifiable way.

Some examples of the filenames I am working with:

The Pupils of Liszt - Conrad Ansorge - 8. Schumann Romance No.2 in F sharp Op.28
Vivaldi - Concerto Grosso in G minor Op.3 No.2 - I. Adagio
Vivaldi - Concerto Grosso in G minor Op.3 No.2 - III. Larghetto
Violin Concerto no. 1 in E flat major, Op. 6 - II. Adagio, III. Rondo Allegro spiritoso
Intermezzo, Op. 117 no. 1
Tchaikovsky - The Nutcracker Suite - Act I, No.1. Overture
Beethoven - Symphony No.9 - II. Scherzo: Molto Vivace - Presto
Tchaikovsky - The Nutcracker Suite - Act I, No.3. Dance of the Sugar Plum Fairy
Tchaikovsky - The Nutcracker Suite - Act I, No.3. Dance of the Sugar Plum Fairy
Tchaikovsky - The Nutcracker Suite - Act II, No.15. Final Waltz and Apotheosis
Etude Op. 25 no. 1 in A flat major - 'Aeolian Harp / Shepherd Boy'
Scherzo no. 3 in C sharp minor, Op. 39
Orchestral Suite no. 2 in B minor, BWV 1067 - 7. Badinerie
Piano Sonata no. 20 in A major, D. 959 - IV. Rondo. Allegretto
Symphony no. 40 in G minor, K. 550 - III. Menuetto; Allegretto
Orchestral Suite no. 2 in B minor, BWV 1067 - 2. Rondeau
Hungarian Dance no. 6 - Vivace in D flat major (orchestral arr.)
The Well Tempered Clavier, Book I, BWV 846-869 - Fugue No.2 in C minor

The terminology has been really tripping me up. At best, I am a dilletente when it comes to classical music, and I am not readily able to differentiate between what is

Violin Concerto no. 1 in E flat major, Op. 6 - II. Adagio, III. Rondo Allegro spiritoso
  1. a Song title, ( spiritoso? )
  2. a Movement, ( II.? )
  3. a Tempo, ( Adagio? )
  4. a Musical Form. ( Violin Concerto? ) Which means I need to get a list of teminology.

So I have been formulating lists. I think I have a full list of Tempos here:

    QStringList tempoList = QStringList()
<< "A piacere"       // the performer may use his or her own discretion with regard to tempo and rhythm; literally "at pleasure"
<< "A tempo"         // resume previous tempo
<< "Accelerando"     // speeding up (abbreviation: accel.)
<< "Adagietto"       // slower than andante (72–76 bpm) or slightly faster than adagio (70–80 bpm)
<< "Adagio"          // slowly with great expression (66–76 bpm)
<< "Adagissimo"      // very slowly
<< "Affrettando"     // speeding up with a suggestion of anxiety
<< "Allargando"      // growing broader; decreasing tempo, usually near the end of a piece
<< "Allegretto"      // by the mid-19th century, moderately fast (102–110 bpm); see paragraph above for earlier usage
<< "Allegrissimo"
<< "Allegro vivace"  // very fast (172–176 bpm)
<< "Allegro moderato"// close to, but not quite allegro (116–120 bpm)
<< "Allegro"         // fast, quickly, and bright (120–156 bpm) (molto allegro is slightly faster than allegro, but always in its range)
<< "Andante moderato"// between andante and moderato (thus the name) (92–98 bpm)
<< "Andante"         // at a walking pace (76–108 bpm)
<< "Andantino"       // slightly faster than andante (although, in some cases, it can be taken to mean slightly slower than andante) (80–108 bpm)
<< "Assai"           // (very) much
<< "Au mouvement"    // play the (first or main) tempo.
<< "Bewegt"          // animated, with motion
<< "Calando"         // going slower (and usually also softer)
<< "Con moto"        // Italian for "with movement"; can be combined with a tempo indication, e.g., Allegro con moto
<< "Doppio movimento"
<< "Doppio più mosso"// double-speed
<< "Doppio più lento"// half-speed
<< "Grave"           // slowly and solemnly
<< "Grave"           // very slow (25–45 bpm)
<< "Kräftig"         // vigorous or powerful
<< "L'istesso tempo" // at the same speed; L'istesso is used when the actual speed of the music has not changed, despite apparent signals to the contrary, such as changes in time signature or note length (half notes in 4
<< "Langsam"         // slowly
<< "Larghetto"       // rather broadly (60–66 bpm)
<< "Larghissimo"     // very, very slow (24 bpm and under)
<< "Largo"           // broadly (40–60 bpm)
<< "Lebhaft"         // lively (mood)
<< "Lent"            // slowly
<< "Lentando"        // gradually slowing, and softer
<< "Lento"           // slowly (45–60 bpm)
<< "Lo stesso tempo" // at the same speed; L'istesso is used when the actual speed of the music has not changed, despite apparent signals to the contrary, such as changes in time signature or note length (half notes in 4
<< "Ma non tanto"    // but not so much; used in the same way and has the same effect as Ma non troppo (see immediately below) but to a lesser degree
<< "Ma non troppo"   // but not too much; used to modify a basic tempo to indicate that the basic tempo should be reined in to a degree; for example, Adagio ma non troppo to mean ″Slow, but not too slow″, Allegro ma non troppo to mean ″Fast, but not too fast″
<< "Marcia moderato" // moderately, in the manner of a march (83–85 bpm)
<< "Meno mosso"      // less movement; slower
<< "Meno moto"       // less motion
<< "Moderato"        // at a moderate speed (98–112 bpm)
<< "Modéré"          // at a moderate tempo
<< "Moins"           // less, as in Moins vite (less fast)
<< "Molto"           // very
<< "Mosso"           // movement, more lively; quicker, much like più mosso, but not as extreme
<< "Mäßig"           // moderately
<< "Più mosso"       // more movement; faster
<< "Poco"            // a little
<< "Precipitando"    // hurrying; going faster/forward
<< "Prestissimo"     // even faster than presto (200 bpm and over)
<< "Presto"          // very, very fast (168–200 bpm)
<< "Rallentando"     // a gradual slowing down (abbreviation: rall.)
<< "Rapide"          // fast
<< "Rasch"           // quickly
<< "Ritardando"      // slowing down gradually; also see rallentando and ritenuto (abbreviations: rit., ritard.) sometimes replaces allargando.
<< "Ritenuto"        // slightly slower, but achieved more immediately than rallentando or ritardando; a sudden decrease in tempo; temporarily holding back. (Note that the abbreviation for ritenuto can also be rit. Thus a more specific abbreviation is riten. Also, sometimes ritenuto does not reflect a tempo change but rather a 'character' change.)
<< "Rubato"          // free adjustment of tempo for expressive purposes, literally "theft"—so more strictly, to take time from one beat to slow another
<< "Schnell"         // fast
<< "Slargando"       // gradually slowing down, literally "slowing down", "widening" or "stretching"
<< "Stretto"         // in a faster tempo, often used near the conclusion of a section. (Note that in fugal compositions, the term stretto refers to the imitation of the subject in close succession, before the subject is completed, and as such, suitable for the close of the fugue. Used in this context, the term is not necessarily related to tempo.)
<< "Stringendo"      // pressing on faster, literally "tightening"
<< "Subito"          // suddenly
<< "Tardando"        // slowing down gradually (same as ritardando)
<< "Tempo Primo"     // resume the original tempo
<< "Tempo comodo"    // at a comfortable (normal) speed
<< "Tempo di ..."    // the speed of a ... (such as Tempo di valzer (speed of a waltz, dotted quarter note. ≈ 60 bpm or quarter note≈ 126 bpm), Tempo di marcia (speed of a march, quarter note ≈ 120 bpm))
<< "Tempo giusto"    // at a consistent speed, at the 'right' speed, in strict tempo
<< "Tempo primo"
<< "Tempo Io"        // denotes an immediate return to the piece's original base tempo after a section in a different tempo (e.g. Allegro ... Lento ... Moderato ... Tempo Io indicates a return to the Allegro). This indication often funct
<< "Tempo primo"     // resume the original (first) tempo
<< "Tempo semplice"  // simple, regular speed, plainly
<< "Très"            // very, as in Très vif (very lively)
<< "Vif"             // lively
<< "Vite"            // fast
<< "Vivace"          // lively and fast (156–176 bpm)
<< "Vivacissimo"     // very fast and lively (172–176 bpm)
<< "a tempo"         // returns to the base tempo after an adjustment (e.g. ritardando ... a tempo undoes the effect of the ritardando).


And now I am working on a full list of Musical forms. Trouble is, there does not seem to be a definitive list. Here is what I have:

  1. Album leaf
  2. Arabesque
  3. Art song
  4. Bacchanale
  5. Bagatelle
  6. Ballade
  7. Ballet
  8. Cantabile
  9. Cantata
  10. Canzonetta
  11. Capriccio
  12. Cassation
  13. Chamber music
  14. Chorale concerto
  15. Chorale fantasia
  16. Chorale setting
  17. Concerto
  18. Divertimento
  19. Etude
  20. Evangelienmotetten
  21. Fantasia
  22. Fugue
  23. Harmonie
  24. Hiérodrame
  25. Humoresque
  26. Hymn concertato
  27. Impromptu
  28. Intermedio
  29. Intermezzo
  30. Masonic music
  31. Melodeclamation
  32. Motet
  33. Motet-chanson
  34. Nocturne
  35. Oratorio
  36. Piano ballade
  37. Prelude
  38. Quodlibet
  39. Rhapsody
  40. Ricercar
  41. Romance
  42. Ruggiero
  43. Sacred concerto
  44. Salon music
  45. Scherzo
  46. Serenade
  47. Sinfonietta
  48. Sonata
  49. Sonnerie
  50. Stile antico
  51. Symphony
  52. Toccata
  53. Villanella
  54. Waltz

And now when I look at it, I see that I am missing Marches and Concertos. Is there a definitive list of Classical Music Forms? Am I even asking a question that makes sense?

  • 3
    You're never going to have a definitive complete list of forms or tempi. A lot of the forms you've listed overlap and it's debatable if all of them describe a musical form.
    – PiedPiper
    Jun 26, 2020 at 8:48
  • 1
    Then there's keeping track of variant spellings of musical forms (e.g. Overture, Ouverture). By the way, "spiritoso" is part of the tempo indication, not the piece/movement title, and your tempo section is missing the German word "Sehr" for "very".
    – Dekkadeci
    Jun 26, 2020 at 11:54
  • 1
    Some composers use their own languages for speed and other things. While you have a couple of German words among all the Italian, there are plenty of others, plus French and English. Then there are all the translations eg jig, giga, gigue, etc
    – Peter
    Jun 26, 2020 at 12:20
  • Ive seen the different spellings and whatnot. It is just one of those things that I have to spend time at until I cover the whole gamete of terminology.
    – Anon
    Jun 26, 2020 at 12:29
  • Your first file name, "The Pupils of Liszt - Conrad Ansorge - 8. Schumann Romance No.2 in F sharp Op.28", is actually pretty aberrant - it actually starts with the album name and the performer name, then what I presume is its listing/ordering number on its album, "8." None of your other file names fit that pattern, and for that first file name, only the portion starting with "Schumann" is structured like the other file names.
    – Dekkadeci
    Jun 26, 2020 at 13:01

2 Answers 2


Possibly one way is to look at the way IMSLP classifies sheet music.
Their View Genres page has top-level classifications of:

  • Work Types
  • Instrumentation
  • Featured Instruments
  • Languages
  • Period/Style

It's likely you want to look at Work Types and Period/Style and compare and weed-out irrelevant headers / topics.
It's an extremely valid (but way out of scope) topic about information retrieval systems and how the data is searched, presented. And also just representing it as a text file or in a database (and which database model to use). I imagine IMSLP are using a SQL database.

You're not going to get a definitive list or classification.
e.g There's a huge difference in works categorised as symphony throughout centuries.
A larger time period will increase the ambiguity of the classification.


I wonder if Machine learning could help here. All those titles can be chopped into sections. Say we define:

  • Composer
  • Performer
  • Catalogue number
  • Piece/song name

Or, alternatively, piece name can be split:

  • Musical form
  • Number. (Either within the opus (more modern composers) or for the total works).
  • Tonal
  • Section
  • Tempo
  • Title (Some pieces have a special title, like Beethoven Sonata no. 14 "Moonlight")

Finally, to encompass 'other stuff' people might toss into the file name (dates, personal notes, locations, instruments, extensions, technical stuff, etc.)

  • Other

So the first title The Pupils of Liszt - Conrad Ansorge - 8. Schumann Romance No.2 in F sharp Op.28 would become (denoting the empty string as ""):

Composer -> Schumann
Performer -> Conrad Ansorge 
Catalogue Number -> Op.28 
Musical Form -> Romance 
Number -> No.2 
Tonal -> in F sharp
Section -> "" 
Tempo -> "" 
Sp. Title -> ""
Other -> The Pupils of Liszt 8

Which always are supposed to go in a specific order in your reordering. Let's say we have a black box that can take any human title and with high accuracy divide it into the bins. Then the remaining work is trivial.

Machine learning models can provide this black box.

The first task is splitting up the title into tokens or words. I would actually leave punctuation and such in, this might be useful for the classifier later. The simple straightforward way of splitting by spaces could work, or you could 'help along' the neural network a bit by considering some small words special: they never occur alone. Example: con in con spirito. You could define con spirito as one token so the neural network does not need to learn they go together.

Each token would then become a vector in the machine learning model via an embedding. You could download a pre-trained embedding or train your own. An embedding must have every token defined as a vector or able to be split into multiple vectors. Examples of existing embeddings are word2vec and FastText. Since there is some agreement between the ways musical titles are written and only a subset of all language tends to be used more often training it specifically only on a large amount of musical titles may improve your results (as the model will more heavily weigh itself towards common terms, improving accuracy).

An LSTM model (some set of LSTM cells in a neural network configuration) could take a sequence of such vectors representing a full title and produce a classification into one of the six bins for each vector, thus each token going into a certain bin. Your error function would then be the amount of tokens binned correctly. Run it on a large pre-binned dataset and it should start to eventually be able to bin as accuratly as humans can.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.