No description, website, or topics provided.
C++ AMPL CMake
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
dtd
.clang-format
.gitignore
CMakeLists.txt
FindXSDCXX.cmake
README.rst
dtdbin.cpp
generate.cpp
grammar-input-stream.cpp
grammar-input-stream.hpp
measure1.cpp
measure1.hpp
music_data.hpp
music_data_serialization_visitor.hpp
musicxml.xsd
note.cpp
note.hpp
part1.cpp
part1.hpp
partwise.cpp
timewise.cpp
utilities.cpp
utilities.hpp
xlink.xsd
xml.xsd
xsdbin.cpp

README.rst

XSDCXX based MusicXML bindings for C++

xsdcxx-musicxml is a MusicXML binding for C++11 based on xsdcxx. The bulk of the source code is automatically generated from the MusicXML W3C XML Schema Definition (XSD). Parsing, manipulation, and serialization of MusicXML documents is supported.

This library handles both, partwise and timewise MusicXML documents in a uniform way. Client code is free to work with either of the two object models, and MusicXML documents are automatically converted to the requested format during parsing.

auto timewise = musicxml::parse<musicxml::score_timewise>(std::cin, "-");
for (auto &measure: timewise.measure()) {
  for (auto &part: measure.part()) {
    std::clog << measure.number() << ": " << part.id()->part_name()
              << std::endl;
    //...
  }
}
musicxml::serialize(std::cout, timewise);

or

auto partwise = musicxml::parse<musicxml::score_partwise>(std::cin, "-");
for (auto &part: partwise.part()) {
  for (auto &measure: part.measure()) {
    std::clog << part.id()->part_name() << ": " << measure.number()
              << std::endl;
    //...
  }
}
musicxml::serialize(std::cout, partwise);

Alternatively, if you want to save to a different format as you have worked with, you can use the musicxml::convert function to flip formats:

// Serialize a score-partwise document.
musicxml::serialize(std::cout, musicxml::convert(timewise));

Both, musicxml::score_partwise::part_type::measure_type and musicxml::score_timewise::measure_type::part_type use boost::variant to store the different allowed element types in a heterogeneous container. This container can be accessed and set with the music_data() accessors, and its type is available as member type music_data_sequence.

IDREF attributes are configured to point directly to the referenced element type(s). Some IDREF's are optional though, so be sure to not dereference those unconditionally.

Building

CMake and XSDCXX are required to build this library.

See generate.cpp, partiwse.cpp and timewise.cpp for very simple usage examples.

To use this library in your project,

#include "xsdcxx-musicxml/musicxml.hpp"

and link with the xsdcxx-musicxml library. If you prefer static linking, use xsdcxx-musicxml-static.

You can also use the CMake ADD_SUBDIRECTORY command to directly include this library as a subproject in your CMake based project.

Parent project

This library is being developed as a sub-project of BMC, the Braille Music Compiler.