OpenSheetMusicDisplay renders sheet music in MusicXML format in your web browser based on VexFlow. OSMD is brought to you by PhonicScore.com.

Overview

OSMD logo OpenSheetMusicDisplay (OSMD)

A MusicXML renderer for the Browser

opensheetmusicdisplay.org
Gitter Appveyor Build status Commitizen friendly

About OSMDDemoKey FeaturesLimitationsHow to Use OSMDSponsor OSMDAbout UsGet In Touch

- Star us on Github - It really helps us a lot!
🙏 - Become our Sponsor - Support our work and receive awesome perks!

About OSMD

OpenSheetMusicDisplay renders MusicXML sheet music in the browser. It is the missing link between MusicXML and VexFlow. Built upon many years of experience in both sheet music interactivity and engraving, it is the perfect solution for app developers seeking to build digital sheet music services.

MusicXML is the de facto standard for exchanging sheet music between music software.
VexFlow is widely used for rendering sheet music. It features an extensive library of musical elements, but each measure and symbol has to be created and positioned by hand in Javascript.

OpenSheetMusicDisplay brings the two together and offers an open source turnkey solution for your digital sheet music project.

Demo

Try the Public Demo to see what OSMD can do.
Learn more about the demo and OSMD in the OSMD Wiki.

Developers can also run a local development demo (see Wiki):

Local OSMD Developer Demo

Key Features

  • Displays MusicXML sheet music in a browser(less) environment (Javascript, Typescript, server-side: browserless NodeJS script)
  • Soon: Audio Playback (work in progress, early access build available for sponsors)
  • Uses Vexflow for rendering and (partly) layout
  • Parses most MusicXML tags and integrates it into an accessible and modifiable data model (e.g. to change a note's color)
  • Offers many options (OSMDOptions / EngravingRules): Page Format, Font Family, Positioning, not rendering certain elements like the title or lyrics, etc.
  • Allows modification of the displayed score, like hiding parts or instruments, hiding instrument names, title or composer, a more compact layout, or coloring notes
  • Outputs SVG or PNG, also via nodejs script in the command line, completely browserless (e.g. for server-side rendering)
  • Written in Typescript with complete type information, 100% compatible with Javascript (minified build is .js)

 

Limitations

Not all MusicXML tags are (fully) supported:

Also, OSMD is a renderer, not an interactive sheet music editor. Rendering takes some time, and you can't easily/quickly move notes, place new notes, etc.

How to Use OSMD

Sponsor OSMD


It would be great if free software were sustainable on its own. But to keep on improving and developing Open Sheet Music Display we need your support. Your monthly sponsorship subscription - especially if you are already actively using OSMD - would mean everything to us - it’s a stable way that would enable us to continue our work, and improve and expand Open Sheet Music Display.
New features currently in the making are:

  • OSMD Audio Player
  • Transposing Plugin
  • Annotations (Add custom text, music symbols, etc. to the score and export to and import from XML)

Our awesome sponsors get awesome perks, like:

  • Early Access to features like the Audio Player and a transposition plugin for OSMD
  • A postcard from Vienna

and others. Check them out at our GitHub sponsors page.

 

And there are other ways to contribute to the community - we plan on starting a blog and newsletter, and sharing our knowledge. We encourage our sponsors to bring up their desired features and pitch blog post ideas.

Though we highly recommend the sponsor route, you can also donate via Paypal:

paypal
Any support is highly appreciated.

About Us

OSMD is made by Phonicscore - a music-tech company based in Vienna. We create solutions for musicians, sheet music publishers, app developers, music stores and researchers:

Our mission is to provide state of the art software solutions for building MusicXML apps and to include the community in a constant thrive for improvement. We want to take away the pain of building music software from scratch and offer a shortcut when it comes to building your next MusicXML sheet music application.

We also want to thank our Github Contributors, who show that with open source many people come together to not only share but improve software.

Get In Touch

To contact us directly, you can:

Issues
  • Display tablatures

    Display tablatures

    VexFlow allows the displaying of guitar tablatures, and MusicXML adds a specific notation to a note for this (documentation here). Is there any plan to add either a single tablature display or a tablature-musicsheet combo (as displayed on VexFlow main page) ?

    good for contrib feature Tabs 
    opened by pikkle 55
  • Transposing XML before loading it into OSMD

    Transposing XML before loading it into OSMD

    i wrote a Javascript function to transpose the XML before it is loaded into OSMD.

    Basically, it reads the XML - line by line - and then rewrites it, while transposing just 4 entries.

    <fifths>-4</fifths>

    <pitch>
         <step>D</step>
         <octave>4</octave>
        </pitch>
    
    <root>
          <root-step>B</root-step>
         <root-alter>-1</root-alter>
    </root>
    
    <bass>
         <bass-step>F</bass-step>
         <bass-alter>1</bass-alter>
        </bass>
    

    There is a little work involved to get #'s vs b's to match key and chords, and to change the octave properly. And I still need to run it through a little more testing.

    But I anyone would like a copy of it, let me know. I can post it here if you like.

    Or if OSMD wants to look an including it in the full version.

    This is going to be great for my project because I can easily transpose and print my scores without having to return to Sibelius, transopose, resave as MusicXML and reload.

    #580

    question 
    opened by AlbertHart 43
  • graphical elements

    graphical elements

    This isn't a bug but just a question. Where are the graphical elements? Like if I wanted to create my own theme to color note heads etc and implement some music notation.

    question 
    opened by impactcolor 33
  • An in-range update of @types/node is breaking the build 🚨

    An in-range update of @types/node is breaking the build 🚨

    The devDependency @types/node was updated from 13.7.3 to 13.7.4.

    🚨 View failing branch.

    This version is covered by your current version range and after updating it in your project the build failed.

    @types/node is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

    Status Details
    • continuous-integration/appveyor/branch: AppVeyor build failed (Details).

    FAQ and help

    There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


    Your Greenkeeper Bot :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 32
  • OSMD renders sus chords as omit3

    OSMD renders sus chords as omit3

    If you compare the MuseScore rendering of the attached MusicXML file MuseScore to the same rendering by OSMD OSMD

    You will notice that the b13sus4 chords are correctly interpreted by MuseScore, while OSMD renders them as b13(omit3) - missing the combination of (omit3, add4) which would spell out "sus". Here's the relevant MusicXML fragment:

          <harmony>
            <root>
              <root-step>E</root-step>
              <root-alter>-1</root-alter>
            </root>
            <kind text="13sus" use-symbols="no">dominant-13th</kind>
            <degree print-object="no">
              <degree-value>3</degree-value>
              <degree-alter>0</degree-alter>
              <degree-type>subtract</degree-type>
            </degree>
            <degree print-object="no">
              <degree-value>4</degree-value>
              <degree-alter>0</degree-alter>
              <degree-type>add</degree-type>
            </degree>
          </harmony>
    

    As per https://github.com/w3c/musicxml/issues/352, there is some ambiguity as to how MusicXML represents sus chords, so care must be exercised in the interpretation of the format.

    bug 
    opened by infojunkie 27
  • String number chord hotfix

    String number chord hotfix

    Resolves remaining issues with https://github.com/opensheetmusicdisplay/opensheetmusicdisplay/issues/949

    opened by jmorag 26
  • feat: Notehead Types (Percussion glyphs are not set/drawn)

    feat: Notehead Types (Percussion glyphs are not set/drawn)

    When loading a MusicXML file containing percussion (drums for example) the glyphs are not drawn correct. It appears to use the default keys: ["g/5"] instead of keys: ["g/5/x2"]

    Expected notes to be similar to: image

    Render notes as: image

    I am happy to attempt a fix if someone could point me in the right direction.

    feature 
    opened by PieterHartzer 25
  • Is it possible to use a different font to display the sheetmusic?

    Is it possible to use a different font to display the sheetmusic?

    Hello. My question is in the issue title, I mean the musical font to display sheetmusic themselves I found similar questions here, but they were asked a long time ago. Maybe something has changed in the new versions of Open Sheet Music Display? If not, maybe there are some solutions how to change the code before build so that the new font can be loaded into project?

    question 
    opened by bmjcmj 24
  • An in-range update of eslint is breaking the build 🚨

    An in-range update of eslint is breaking the build 🚨

    ☝️ Greenkeeper’s updated Terms of Service will come into effect on April 6th, 2018.

    Version 4.18.2 of eslint was just published.

    Branch Build failing 🚨
    Dependency eslint
    Current Version 4.18.1
    Type devDependency

    This version is covered by your current version range and after updating it in your project the build failed.

    eslint is a devDependency of this project. It might not break your production code or affect downstream projects, but probably breaks your build or test tools, which may prevent deploying or publishing.

    Status Details
    • continuous-integration/travis-ci/push The Travis CI build passed Details
    • continuous-integration/appveyor/branch AppVeyor build failed Details

    Release Notes v4.18.2
    • 6b71fd0 Fix: [email protected], because 4.0.3 needs "ajv": "^6.0.1" (#10022) (Mathieu Seiler)
    • 3c697de Chore: fix incorrect comment about linter.verify return value (#10030) (Teddy Katz)
    • 9df8653 Chore: refactor parser-loading out of linter.verify (#10028) (Teddy Katz)
    • f6901d0 Fix: remove catastrophic backtracking vulnerability (fixes #10002) (#10019) (Jamie Davis)
    • e4f52ce Chore: Simplify dataflow in linter.verify (#10020) (Teddy Katz)
    • 33177cd Chore: make library files non-executable (#10021) (Teddy Katz)
    • 558ccba Chore: refactor directive comment processing (#10007) (Teddy Katz)
    • 18e15d9 Chore: avoid useless catch clauses that just rethrow errors (#10010) (Teddy Katz)
    • a1c3759 Chore: refactor populating configs with defaults in linter (#10006) (Teddy Katz)
    • aea07dc Fix: Make max-len ignoreStrings ignore JSXText (fixes #9954) (#9985) (Rachael Sim)
    Commits

    The new version differs by 12 commits.

    • 22ff6f3 4.18.2
    • 817b84b Build: changelog update for 4.18.2
    • 6b71fd0 Fix: [email protected], because 4.0.3 needs "ajv": "^6.0.1" (#10022)
    • 3c697de Chore: fix incorrect comment about linter.verify return value (#10030)
    • 9df8653 Chore: refactor parser-loading out of linter.verify (#10028)
    • f6901d0 Fix: remove catastrophic backtracking vulnerability (fixes #10002) (#10019)
    • e4f52ce Chore: Simplify dataflow in linter.verify (#10020)
    • 33177cd Chore: make library files non-executable (#10021)
    • 558ccba Chore: refactor directive comment processing (#10007)
    • 18e15d9 Chore: avoid useless catch clauses that just rethrow errors (#10010)
    • a1c3759 Chore: refactor populating configs with defaults in linter (#10006)
    • aea07dc Fix: Make max-len ignoreStrings ignore JSXText (fixes #9954) (#9985)

    See the full diff

    FAQ and help

    There is a collection of frequently asked questions. If those don’t help, you can always ask the humans behind Greenkeeper.


    Your Greenkeeper Bot :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 23
  • Stop messing with canvas size

    Stop messing with canvas size

    We want to remove the setWidth() option as OSMD should retrieve the width from the underlying HTML canvas only. Furthermore, OSDM should not change the size of HTML elements such as the canvas. The size of a music sheet display must be determined only by the size of the canvas HTML element, which is set by the browser according to inline attributes or CSS styles. We have to respect that, otherwise it will be impossible to integrate OSMD into any webpage.

    • [x] Refactor to avoid usage of setWidth()
    • [x] Stop resizing canvas, respect HTML element size
    • [ ] Tests for removed setWitdh()
    • [ ] Tests for respecting true canvas size
    enhancement 
    opened by sebastianhaas 22
  • Backup note near end of measure rendered incorrectly

    Backup note near end of measure rendered incorrectly

    DISPLAY ON FINALE: image

    ERROR IN OSMD image

    opened by kenboy2304 3
  • Migrate to webpack 5

    Migrate to webpack 5

    I've been playing around with building this as an esm module and a necessary prerequisite is to upgrade to webpack 5 which supports that. Haven't gotten the esm stuff working yet, but this is nice to have on its own.

    opened by jmorag 2
  • General event support

    General event support

    Proposal

    I think that OSMD integration/adoption could be enhanced by creating a general event (not just DOM) system that callers can hook into.

    Hopefully these contrived examples are illustrative of the possibilities:

    type OSMDEvent<P, M = any> = { id: number; metadata: M; payload: P };
    
    type CursorChangeEvent = OSMDEvent<{
      cursor: Cursor;
    }>;
    
    enum GraphicType {
      Note,
      Lyric,
    }
    
    type GraphicEvent = OSMDEvent<
      | { type: GraphicType.Note; note: Note }
      | { type: GraphicType.Lyric; lyric: Lyric, syllabic: boolean, text: string }
    >;
    
    // Non-DOM event: Vibrate a device every time the cursor changes.
    osmd.on("cursorchange", (event: CursorChangeEvent) => {
      makeHapticFeedback(HapticFeedbackIntensity.Gentle, Duration.ms(10));
    });
    
    // Color a note head whenever it's hovered.
    osmd.on("graphichover", (event: GraphicEvent) => {
      if (event.payload.type === GraphicType.Note) {
        const { note } = event.payload;
        if (noteColorer.currentlyColoredNote && noteColorer.currentlyColoredNote !== note) {
          noteColorer.restoreOriginalColor(noteColorer.currentlyColoredNote);
        }
        noteColorer.color(note, 'osmd-orange');
      }
    });
    
    // Announce the entire word of a lyric when it's clicked.
    osmd.on("graphicclick", (event: GraphicEvent) => {
      if (event.payload.type === GraphicType.Lyric) {
        const { lyric, syllabic, text } = event.payload;
        const word = syllabic ? [text, ...getRemainingSyllablesAfter(lyric)].map(withoutTrailingHyphens).join('') : text;
        if (screenreader.canPronounce(word)) {
          screenreader.announce(word);
        }
      }
    

    Discussion

    I think this can be done in a way that is not invasive and can be introduced gradually.

    A possible solution could be to create an event bus that allows OSMD callers to hook into. Internally, the event bus would maintain a mapping of event names to arrays of listeners. Within the OSMD codebase, this event bus would be used to dispatch events with payloads that correspond to the event name.

    One of the drawbacks of this approach is that it is the caller's responsibility for cleaning up listeners, since OSMD would not know nor care about the context outside of its purview. Perhaps there's something clever that can be done with WeakRef, but I'm unsure.

    Another benefit of this approach is that it may surface refactoring opportunities within the OSMD codebase. For example, if there's a cursorchange being dispatched from several methods, it might suggest that there's a common behavior that can be abstracted out amongst them. It also might suggest that the event dispatching is done in the wrong place as well as a bunch of other possibilities.

    Related Issues

    #262 0xfe/vexflow#371

    opened by jaredjj3 10
  • Display lyrics in between staves, Grand Staff

    Display lyrics in between staves, Grand Staff

    Hi,

    I'm using OSMD, and it is a very nice library, in that unlike many other applications; it tells me what notes are in key and which are accidentals, however I am wondering if it may be possible to always have lyrics displayed in between the staves of a grand staff, i.e., specifically in relation to piano.

    The reason I ask is because, some of the music I write has the melody predominately in the bass clef, and if text is entered for notes, e.g., in Cubase/Nuendo, when I do a MIDI export and then import into Forte Notation, and subsequently export as MusicXML; the display is less than optimal since many of the words appear below the bass clef and the only way to have them appear below the treble clef, is to edit the XML data, which is tiresome at best.

    I wish the developers all the best with the future in relation to developing an audio engine but otherwise I believe this is the ultimate library, for web-based sheet music display!

    Regards

    opened by nascent 0
  • Transposition function doesn't work after build in react app

    Transposition function doesn't work after build in react app

    Hello, I use opensheetmusicdisplay for my react application. I have an error when i use transposition function when app is builded "npm run build". But it works in developement mode "npm run start"

    this.osmd.updateGraphic()

    • in chromium browser image

    • in Firefox [...] VexFlowMusicSheetDrawer.drawMeasure TypeError: u is undefined

    // ...
    this.osmd = new OSMD(this.divRef.current, this.osmdOptions)
    this.osmd.TransposeCalculator = new TransposeCalculator()
    // ...
    transpose (value = 0) {
        this.osmd.Sheet.Transpose = parseInt(value)
        this.osmd.updateGraphic()
        this.osmd.render()
    }
    

    I don't know why it doesn't works after build ?

    opened by fedwiiix 11
  • Roman Numeral Analysis / Figured Bass

    Roman Numeral Analysis / Figured Bass

    Hi,

    I am wondering if there is a fix for displaying figured bass / inversions for roman numeral analysis. What I am seeing is that when the figured bass is stacked (e.g., I6/4), the bottom number is replaced with a different symbol. The top number seems to be fine by itself (e.g., I6).

    Below is an image of what it looks like in Sibelius: Roman Numeral : Figured Bass in Sibelius

    Here is how it appears on osmd: Roman Numeral : Figured Bass in OSMD

    I attached an xml of this file as well. Roman Numeral : Figured Bass Test.xml.zip

    Thank you!

    feature 
    opened by jekeough 0
  • Rendering errors on second voice

    Rendering errors on second voice

    @sschmidTU making a build using the latest VexFlow and comparing the outputs to those from Smoosic I realised that the second voice is not rendered properly, the notes are misaligned. Also with 1.2.93

    opened by rvilarl 10
  • Should we make PRs in Vexflow for the files under VexFlowPatch

    Should we make PRs in Vexflow for the files under VexFlowPatch

    @sschmidTU I made a build of my App using the latest stand of VexFlow and it seems that the output now good enough to replace 1.2.93. I will suggest @0xfe to make a formal build 4.0.0.

    Would it make sense to include the changes of VexFlowPatch in VexFlow in order to avoid the patch?

    discussion 
    opened by rvilarl 3
  • Render bug

    Render bug

    Not sure why but some stuff is rendered in the wrong place. Source: Musescore .mxl for Moonlight Sonata, piano only.

    Expected: 2_moonlight_expected

    Actual: 2_moonlight_reality

    The relevant part from the .xml:

    XML
    <measure number="42" width="605.50">
          <print new-page="yes">
            <system-layout>
              <system-margins>
                <left-margin>21.00</left-margin>
                <right-margin>0.00</right-margin>
                </system-margins>
              <top-system-distance>70.00</top-system-distance>
              </system-layout>
            <staff-layout number="2">
              <staff-distance>98.20</staff-distance>
              </staff-layout>
            </print>
          <direction placement="below">
            <direction-type>
              <dynamics default-x="6.58" default-y="-40.00" relative-y="-40.00">
                <pp/>
                </dynamics>
              </direction-type>
            <staff>1</staff>
            <sound dynamics="36.67"/>
            </direction>
          <direction placement="below">
            <direction-type>
              <pedal type="start" line="yes" default-y="-132.05"/>
              </direction-type>
            <staff>1</staff>
            </direction>
          <note default-x="119.51" default-y="-15.00">
            <pitch>
              <step>E</step>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">begin</beam>
            <notations>
              <tuplet type="start" bracket="no"/>
              </notations>
            </note>
          <note default-x="157.36" default-y="-5.00">
            <pitch>
              <step>G</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            </note>
          <note default-x="195.21" default-y="10.00">
            <pitch>
              <step>C</step>
              <alter>1</alter>
              <octave>4</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">end</beam>
            </note>
          <attributes>
            <clef number="1">
              <sign>G</sign>
              <line>2</line>
              </clef>
            </attributes>
          <note default-x="250.32" default-y="-65.00">
            <pitch>
              <step>G</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">begin</beam>
            </note>
          <note default-x="288.17" default-y="-50.00">
            <pitch>
              <step>C</step>
              <alter>1</alter>
              <octave>4</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            </note>
          <note default-x="326.02" default-y="-40.00">
            <pitch>
              <step>E</step>
              <octave>4</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">end</beam>
            </note>
          <note default-x="363.87" default-y="-65.00">
            <pitch>
              <step>G</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>down</stem>
            <staff>1</staff>
            <beam number="1">begin</beam>
            </note>
          <note default-x="401.72" default-y="-50.00">
            <pitch>
              <step>C</step>
              <alter>1</alter>
              <octave>4</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>down</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            </note>
          <note default-x="439.57" default-y="-40.00">
            <pitch>
              <step>E</step>
              <octave>4</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>down</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            </note>
          <note default-x="477.43" default-y="-65.00">
            <pitch>
              <step>G</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>down</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            </note>
          <note default-x="515.28" default-y="-50.00">
            <pitch>
              <step>C</step>
              <alter>1</alter>
              <octave>4</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>down</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            </note>
          <note default-x="553.13" default-y="-40.00">
            <pitch>
              <step>E</step>
              <octave>4</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>down</stem>
            <staff>1</staff>
            <beam number="1">end</beam>
            <notations>
              <tuplet type="stop"/>
              </notations>
            </note>
          <backup>
            <duration>12</duration>
            </backup>
          <note default-x="477.43" default-y="-30.00">
            <pitch>
              <step>G</step>
              <alter>1</alter>
              <octave>4</octave>
              </pitch>
            <duration>9</duration>
            <voice>2</voice>
            <type>eighth</type>
            <dot/>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">begin</beam>
            </note>
          <note default-x="570.33" default-y="-30.00">
            <pitch>
              <step>G</step>
              <alter>1</alter>
              <octave>4</octave>
              </pitch>
            <duration>3</duration>
            <voice>2</voice>
            <type>16th</type>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">end</beam>
            <beam number="2">backward hook</beam>
            </note>
          <backup>
            <duration>48</duration>
            </backup>
          <note default-x="116.19" default-y="-198.20">
            <pitch>
              <step>C</step>
              <alter>1</alter>
              <octave>2</octave>
              </pitch>
            <duration>48</duration>
            <voice>5</voice>
            <type>whole</type>
            <staff>2</staff>
            </note>
          <note default-x="116.19" default-y="-178.20">
            <chord/>
            <pitch>
              <step>G</step>
              <alter>1</alter>
              <octave>2</octave>
              </pitch>
            <duration>48</duration>
            <voice>5</voice>
            <type>whole</type>
            <staff>2</staff>
            </note>
          <note default-x="116.19" default-y="-163.20">
            <chord/>
            <pitch>
              <step>C</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>48</duration>
            <voice>5</voice>
            <type>whole</type>
            <staff>2</staff>
            </note>
          </measure>
    
    bug 
    opened by Ulrira2k 1
  • Unison display

    Unison display

    I know this was already mentioned somewhere but I'd like to emphasize that this problem really brings down the usability of osmd - which is otherwise a fantastic project! - significantly. The following is from a musescore .mxl (moonlight sonata, piano only)

    Expected: (what it looks like in Musescore) moonlight_expected

    Actual in OSMD: (I can kinda live with the first unison but please note the second unison which adds a completely confusing note in the wrong place) moonlight_reality

    Not sure if the xml is useful to you but just in case:

    XML
    <measure number="37" width="340.58">
          <note default-x="17.12" default-y="-35.00">
            <pitch>
              <step>F</step>
              <alter>1</alter>
              <octave>4</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">begin</beam>
            <notations>
              <tuplet type="start" bracket="no"/>
              <slur type="start" placement="above" number="1"/>
              </notations>
            </note>
          <note default-x="50.20" default-y="-55.00">
            <pitch>
              <step>B</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <accidental>sharp</accidental>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            </note>
          <note default-x="73.82" default-y="-45.00">
            <pitch>
              <step>D</step>
              <alter>1</alter>
              <octave>4</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            </note>
          <attributes>
            <clef number="1">
              <sign>F</sign>
              <line>4</line>
              </clef>
            </attributes>
          <note default-x="126.40" default-y="0.00">
            <pitch>
              <step>A</step>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            </note>
          <note default-x="150.02" default-y="5.00">
            <pitch>
              <step>B</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            </note>
          <direction placement="below">
            <direction-type>
              <wedge type="stop" number="1"/>
              </direction-type>
            <staff>1</staff>
            </direction>
          <direction placement="below">
            <direction-type>
              <dynamics default-x="6.58" default-y="-48.65" relative-y="-40.00">
                <p/>
                </dynamics>
              </direction-type>
            <staff>1</staff>
            <sound dynamics="54.44"/>
            </direction>
          <note default-x="173.64" default-y="-10.00">
            <pitch>
              <step>F</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">end</beam>
            <notations>
              <slur type="stop" number="1"/>
              </notations>
            </note>
          <note default-x="197.26" default-y="0.00">
            <pitch>
              <step>A</step>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">begin</beam>
            <notations>
              <slur type="start" placement="above" number="1"/>
              </notations>
            </note>
          <note default-x="220.88" default-y="-20.00">
            <pitch>
              <step>D</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            <notations>
              <slur type="start" placement="above" number="2"/>
              </notations>
            </note>
          <note default-x="244.50" default-y="-10.00">
            <pitch>
              <step>F</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            </note>
          <note default-x="268.12" default-y="-25.00">
            <pitch>
              <step>C</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            <notations>
              <slur type="stop" number="2"/>
              </notations>
            </note>
          <note default-x="291.74" default-y="-10.00">
            <pitch>
              <step>F</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">continue</beam>
            </note>
          <note default-x="315.36" default-y="0.00">
            <pitch>
              <step>A</step>
              <octave>3</octave>
              </pitch>
            <duration>4</duration>
            <voice>1</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>half</normal-type>
              </time-modification>
            <stem>up</stem>
            <staff>1</staff>
            <beam number="1">end</beam>
            <notations>
              <tuplet type="stop"/>
              <slur type="stop" number="1"/>
              </notations>
            </note>
          <backup>
            <duration>24</duration>
            </backup>
          <note print-object="no">
            <rest/>
            <duration>4</duration>
            <voice>2</voice>
            <type>eighth</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>eighth</normal-type>
              </time-modification>
            <staff>1</staff>
            <notations>
              <tuplet type="start" bracket="yes"/>
              </notations>
            </note>
          <note default-x="220.88" default-y="-20.00">
            <pitch>
              <step>D</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>8</duration>
            <voice>2</voice>
            <type>quarter</type>
            <time-modification>
              <actual-notes>3</actual-notes>
              <normal-notes>2</normal-notes>
              <normal-type>eighth</normal-type>
              </time-modification>
            <stem>down</stem>
            <staff>1</staff>
            <notations>
              <tuplet type="stop"/>
              </notations>
            </note>
          <note default-x="268.12" default-y="-25.00">
            <pitch>
              <step>C</step>
              <alter>1</alter>
              <octave>3</octave>
              </pitch>
            <duration>12</duration>
            <voice>2</voice>
            <type>quarter</type>
            <stem>down</stem>
            <staff>1</staff>
            </note>
          <backup>
            <duration>48</duration>
            </backup>
          <note default-x="13.80" default-y="-180.95">
            <pitch>
              <step>G</step>
              <alter>1</alter>
              <octave>1</octave>
              </pitch>
            <duration>48</duration>
            <tie type="stop"/>
            <voice>5</voice>
            <type>whole</type>
            <staff>2</staff>
            <notations>
              <tied type="stop"/>
              </notations>
            </note>
          <note default-x="13.80" default-y="-145.95">
            <chord/>
            <pitch>
              <step>G</step>
              <alter>1</alter>
              <octave>2</octave>
              </pitch>
            <duration>48</duration>
            <tie type="stop"/>
            <voice>5</voice>
            <type>whole</type>
            <staff>2</staff>
            <notations>
              <tied type="stop"/>
              </notations>
            </note>
          </measure>
    
    opened by Ulrira2k 1
Releases(1.2.0)
Owner
Open Sheet Music Display
OpenSheetMusicDisplay renders sheet music in MusicXML format in your web browser based on VexFlow. Brought to you by Phonicscore.com.
Open Sheet Music Display
Music typeset with the Lilypond system

Intro (from long ago) This repo contains sheet music typeset with the Lilypond typesetter. The music chosen is in favour of cello music (mostly chambe

Enthusiastic about  the Cello 95 Sep 24, 2021
🎵 Music notation engraving library for MEI with MusicXML and Humdrum support and various toolkits (JavaScript, Python)

Verovio is a fast, portable and lightweight library for engraving Music Encoding Initiative (MEI) digital scores into SVG images. Verovio also contain

RISM Digital Center 426 Sep 22, 2021
web based music sheet viewer (go, pdfjs) as a single binary

Digital Music Stand A simple cross-platform browser-based pdfjs-based viewer to display and search music sheets. A single binary including all assets.

Patrick Wieschollek 21 Aug 27, 2021
A beautiful cross platform Desktop Player for Google Play Music

Google Play Music™ Desktop Player Windows: MacOS / Linux: Run "Google Play Music" as a standalone desktop app. Never again will you have to hunt throu

Samuel Attard 8.5k Sep 12, 2021
Typographic Beat-Oriented Notation for music

tbon Typographic Beat-Oriented Notation for music Tbon aims to be the fastest way to enter pitches, rhythms, meter and dynamic levels from a computer

null 11 Jan 23, 2020
A Music programming language. Translates source code into MIDI. Includes a player. Supports MIDI-Karaoke. Includes a MIDI analyzer.

Get Started | Features | Screenshots | Programming | CLI | Contribute | License Midica is an interpreter for a Music Programming Language. It translat

Jan Trukenmüller 47 Sep 17, 2021
网易云音乐第三方

ieaseMusic Elegant NeteaseMusic desktop app, Rock with NeteaseMusic ?? Built by Electron, React, MobX, JSS API 由 Binaryify/NeteaseCloudMusicApi 提供。 Pr

null 8.6k Sep 22, 2021
Collaborative Programmable Music

888 888 _ooooooooo._ 888 ,o888PP""""PP88

Overtone 5.2k Sep 24, 2021
Frescobaldi LilyPond Editor

README for Frescobaldi Homepage: http://www.frescobaldi.org/ Main author: Wilbert Berendsen Frescobaldi is a LilyPond sheet music text editor. It aims

Frescobaldi 501 Sep 21, 2021
A language for music notation

Lydown is a language and compiler for creating music scores, parts and snippets. The lydown code is compiled to lilypond code and then compiled to PDF

Sharon Rosner 21 Apr 8, 2021
A music programming language for musicians. :notes:

Installation | Docs | Changelog | Contributing composers chatting Alda is a text-based programming language for music composition. It allows you to co

Alda 4.7k Sep 25, 2021
Split flac/ape/wv/wav + cue sheet into separate tracks

See unflac as a better replacement of this project. split2flac split2flac splits one big APE/FLAC/TTA/WV/WAV audio image (or a collection of such file

Sigrid Solveig Haflínudóttir 248 Jun 22, 2021
MuseScore is an open source and free music notation software. For support, contribution, bug reports, visit MuseScore.org. Fork and make pull requests!

Music notation and composition software MuseScore is an open source and free music notation software. For support, contribution, and bug reports visit

MuseScore 6.3k Sep 24, 2021
Open source sheet music

The Mutopia Project The Mutopia Project offers sheet music based on editions in the public domain. All sheet music is written in LilyPond by volunteer

null 187 Sep 3, 2021
Music player for deepin desktop environment.

deepin-music Deepin music is a local music player with beautiful design and simple functions developed by Deepin Technology. Dependencies Build depend

Wuhan Deepin Technology Co.,Ltd. 155 Sep 16, 2021
MusicXML parsing and layout library

mxml mxml is a C++ parser and layout generator for MusicXML files. Usage You will need: CMake >= 2.6 LibXML2 boost (for unit tests) To build a stand-a

Reinvent Inc. 19 Mar 29, 2021
Mopidy is an extensible music server written in Python

Mopidy Mopidy is an extensible music server written in Python. Mopidy plays music from local disk, Spotify, SoundCloud, Google Play Music, and more. Y

Mopidy 7.2k Sep 17, 2021
Music sheet rendering for iOS

MusicKit MusicKit is an iOS/MacOS X framework for rendering sheet music. It depends on mxml for loading and laying out MusicXML files. Setup After clo

Reinvent Inc. 98 Sep 7, 2021