Factors out HasOctaves and HasSemitones classes