General class MusicalInstrument associates MidiRhythmicInstrument and MidiMelodicInstrument, i.e. two basic sets of tens of instruments used in electronic music..
For practical reasons, instruments are assigned to so-called music channels MidiChannel. The introduction of channels was necessary due to the limited capabilities of electronic tools (typically a maximum of 16 or 32 channels). One channel can use multiple voices (in the MIDI concept of so-called tracks) - ie, for example, two different violin voices can be assigned to the same channel. Even so this thing (due to the fact that some instrumentation eg music of the period of Romanticism have dozens of parallel voices) complicates the general possibilities of processing.
The musical instrument - melodic and rhythmic - is represented by one class (MusicalInstrument).
The instrument numbering respects the MIDI standard: definitions especially for melodic (MidiMelodicInstrument) and especially for rhythmic (MidiRhythmicInstrument) instruments. Instruments are used in combination with MIDI channels (MidiChannel).
The instruments are divided into groups (by MIDI standard): MidiMelodicSection, MidiRhythmicSection
In order to further classify the instruments were introduced: InstrumentGroup (InstrumentGroupMelodic, InstrumentGroupRhythmic).
The current orchestration of the given part of the composition is concentrated in the so-called orchestra block (OrchestraBlock). The lines of the individual instruments are represented here as orchestral tracks (OrchestraTrack) within the band of tracks (OrchestraStrip).
The orchestral controller is used to verify the correct use of the instruments and to correct them (OrchestraChecker).
The orchestration of the entire composition - ie the list of orchestra blocks - is covered by the class MusicalOrchestration.
For a certain classification, we define groups of orchestrations.
The instruments have certain characteristics (eg the range of pitches typical for them, the group they belong to, etc.). Therefore, it may be useful to hold lists of instruments (along with properties, ...) in files (XML) and load them into the program..
Similarly, we can deal with the list of orchestrations.