All notable changes to this project will be documented in this file.
- Replace the deprecatted 'pkg_recourses' package to 'importlib.resources'
- Fix break lines and doubles spaces on the score parts name
- Note and Chord classes:
- .setDurationTicks(const int) replaced by .setDuration(const Duration&)
- MUSICXML::NOTE_TYPE remove all dotted rhythmFigure constants
- Replace all old mentions of 'duration' by 'RhythmFigure'
- Note class:
- Remove: .removeDots(), .setSingleDot(), setDoubleDot()
- New class Duration
- New class Fraction to store any possible musical note duration
- New class TimeSignature
- Add Helper::ticks2rhythmFigure()
- Add Cpptrace library to get the stackTrace when a exception occors inside the maiacore library
- Improve CMakeLists.txt reading
- Add VERSION file
- Helper::ticks2noteType() now supports tuplets
- Note::getDuration() now supports tuplets
- Note class now have a Duration private member
- Add "kaleido" and "nbformat" as install requirements
- Score::getChords fixed chord stack with tuplets
- Score::getLoadedFilePath() to .getFilePath()
- Score Class:
- Add .getFileName()
- Chord Class:
- Add .getQuality()
- Note Class:
- Add .getWrittenPitchClass()
- Add .getSoundingPitchClass()
- Score::getChords() and getChordsDataFrame() returns struct with a new boolean field called 'isHomophonic'
- Interval::analyse() add 'diminished unison' and 'augmented unison' invervals
- Note::getPitchClass() now points to Note::getSoundingPitchClass()
- Note::getPitchStep() now points to Note::getSoundingPitchStep()
- Remove ScoreCollection::get/setName
- Add Score::getLoadedFilePath
- Improve Github Actions wheels.yml file
- Add Score::haveAnacrusisMeasure()
- Auto fix XML scores that contais multiple part with the same name
- Update Pybind11 to v2.12.0
- Update pybind11-stub-gen to v2.5.1
- Update pybind11_json to v0.2.14
- Update nlomann::json to v3.11.3
- Note::getScaleDegree() now works ok
- Fix initial score clefs bug
- Score::toFile() show the output XML file absolute path in the LOG
- www.maialib.com DNS now point to the official maialib documentation
- Fix all maialib examples located inside the
python-tutorial
folder
- Chord::getSetharesPartialsDissonance() replaced by .getSetharesDyadsDissonance()
- Wrapper: getSetharesPartialsDataFrame replaced by getSetharesDyadsDataFrame getSetharesDyadsDataFrame
- Rename and add new columns
- maiapy
- .plotChordDyadsSetharesDissonanceHeatmap()
- ml.plotSetharesDissonanceCurve
- Python Wrapper: Chord.getSetharesDissonanceValue() replaced by .getSetharesDissonance()
- Chord::getSetharesDyadsDissonance()
- Python Wrapper called: .getSetharesDyadsDataFrame()
- maiapy
- 'plotScoreSetharesDissonance':
- Add 'numPartials', 'useMin', 'ampCallback' arguments
- Add optional 'plotType' input argument: 'scatter' or 'line'
- Add optional 'lineShape' input argument: 'linear' or 'spline'
- Add line label for the 'mean value': Dissonance Mean
- 'plotScoreSetharesDissonance':
- maiacore
- Improve error message to help users to fix corrupted XML files
- maiapy
- plotScoreSetharesDissonance:
- Add new input argument 'numPoints' to create a interpolated curve
- Add a horizontal dashed line to show the 'dissonance mean' value
- plotScoreSetharesDissonance:
- maiapy
- Fix plotScoreSetharesDissonance display title
-
Note Class
- .getHarmonicSpectrum()
-
Chord Class
- .getHarmonicSpectrum()
- .getSetharesDissonanceValue()
-
maiapy
- Add ml.plotSetharesDissonanceCurve()
- Add ml.plotScoreSetharesDissonance()
- Note::getPitch() now returns the 'soundingPitch' and not the 'writtenPitch'
- Note::getFrequency() now have 2 optional input arguments:
- bool equalTemperament = true
- float freqA4 = 440.0f
- Score class
- Disable (comment) the methods: .countNotes() and .findPattern(). Future work.
- Key class: Add overload constructor that accepts a string as a key signature
- Note class: Add .getScaleDegree(const Key&)
- Chord::getCloseStackHarmonicComplexity()
- Chord::getHarmonicDensity()
-
Chord Class
- .getMeanFrequency()
- .getMeanMidiValue()
- .getMeanPitch()
- .getMeanOfExtremesFrequency()
- .getMeanOfExtremesMidiValue()
- .getMeanOfExtremesPitch()
- .getFrequencyStd()
- .getMidiValueStd()
- .getDegree()
- .getRomanDegree()
-
New 'Key' Class
-
Maiapy functions
- .plotScorePitchEnvelope()
- .plotChordsNumberOfNotes()
- Score::getChordsDataFrame() includes a new column 'key'
- Python wrapper: Chord::repr() shows a list of soundingPitch notes
- Chord class now have "for range" C++ iterators
- Upgrade SqLiteCpp to v3.2.1
- Score::getChords() and .getChordsDataFrame() now works good
- Score::info() shows the partName list correctly
- Maialib plots that were broken, now works good
- Beethoven 5th XML metadata: fix to Cm key
- Maiacore
Measure
Class:- .getQuarterDuration, .getFilledQuarterDuration, .getFreeQuarterDuration
- .getDurationTicks, .getFilledDurationTicks, .getFilledDurationTicks
Helper::int duration2Ticks()
- Maiapy:
setScoreEditorApp()
add special documentation for Mac OSX
- Score change clef in export XML file
- Part::setIsPitched() now works correctly
Chord::getIntervalsFromOriginalSortedNotes()
- All
Chord
methods that starts with.have
+ Interval name
- Maiacore:
- Add:
Part::get/setPartIndex(int)
- Add:
- Maiapy:
- Add:
setScoreEditorApp()
andopenScore()
functions
- Add:
- To build maiacore now is necessary v3.26
- Update GoogleTests to v1.13.0
- Split
Score::getChords()
andScore::getChordsDataFrame()
in two methods
- Maiacore:
Score::getPart(std::string&)
methodScore::getPartsNames()
now is the standard way to get the all the parts namesMeasure::isEmpty()
-
Nothing change
-
Add
Duration
enum class Python wrapper -
Continuous Integration & Continuous Delivery through Github Actions to Pypi
-
Add Microsoft Visual Studio Compiler (MSVC) compatibility
-
Uses Clang++ as a default compiler on Windows when execute
make
-
Helper Class
:- Add .frequencies2cents() method
- Add .freq2equalTemperament() method
-
Interval Class
: Add .toCents() method -
Chord Class
: Add .toCents() methods -
Add
Score::getComposerName()
method
Score::info()
added apartName
listScore::instrumentFragmentation()
replacepartNumber
topartNames
- Add overload
Note::setDuration(const float durationValue, const int lowerTimeSignatureValue = 4)
- Install using
pyproject.toml
file - Better folder organization
- Better headers declaration organization inside the
*.cpp
files
Interval::isSimple()
andInterval::isCompound()
Score::instrumentFragmentation
: CallgetComposerName()
andgetTitle()
Chord::getStackedHeaps()
->Chord::getStackDataFrame()
Interval Class
: 50 new classification methods- Replace old log using
std::cout
by the new C++ macros for log data and exceptions:LOG_DEBUG()
LOG_INFO()
LOG_WARN()
LOG_ERROR()
Chord Class
- 50 new
.haveXInterval()
methods .getCloseChord()
.isInRootPosition()
- 50 new
- Add
make validate
: IncludesCppCheck
andCppLint
Chord Class
.getStackDataFrame()
and.getStackHeaps()
: Improve sorted heaps algorithm and DataFrame data types
Interval Class
:.isAscendant()
.isDescendant()
Interval Class
:.getDiatonicInterval()
Chord::getRoot()
Chord::getStackedChord()
->Chord::getOpenStackChord()
Note Class
:.getFrequency()
.getEnharmonicPitch()
.toEnharmonicPitch()
.getEnharmonicPitches()
.getEnharmonicNote()
.getEnharmonicNotes()
Interval Class
:.setNotes()
.getPitchStepInterval()
.isMinorThird()
.isMajorThird()
.isDiminishedFifth()
.isPerfectFifth()
.isAugmentedFifth()
.isDiminishedSeventh()
.isMinorSeventh()
.isMajorSeventh()
.isMinorNinth()
.isMajorNinth()
.isPerfectEleventh()
.isSharpEleventh()
.isMinorThirdteenth()
.isMajorThirdteenth()
.isSimple()
.isCompound()
- Oveload operator
<
Helper Class
:.midiNote2octave()
.notes2intervals()
Chord Class
:.getOpenStackChord()
.getCloseStackChord()
.getOpenStackedNotes()
.getStackedHeaps()
.getOpenStackIntervals()
.getCloseStackIntervals()
.isSorted()
- New Unit Tests:
Note::getEnharmonicPitch
Note::getEnharmonicPitches()
Note::getEnharmonicNotes()
Chord::stackInThirds()
now can use enharmony to compute the stacked chordInterval::getDiatonicSteps()
added optional argumentuseSingleOctave
Chord::getMIDIIntervals()
added optional argumentfirstNoteAsReference
- Now every maiacore C++ exception message starts with
[maiacore]
prefix
Note::Note()
Prevent invalid user type octaves and out of range MIDI numbers
- Add maialib Python stubs
ScoreCollection
class:- Add overloaded constructor: vector of directories paths
- Add
.merge(ScoreCollection& other)
method - Add
+
operator overload to.merge(ScoreCollection& other)
method - Add
.getNumDirectories()
method - Add
.addDirectory()
method - Add
.setDirectoriesPaths()
method - Add oveloaded methods:
.addScore(const std::string& filePath)
.addScore(const std::vector<std::string>& filePaths)
- Replace
python3
topython
calls - Update
Pybind11
to v2.10.0
- C++ & Python unit tests are now running without any errors:
make cpp-tests
make py-tests
make tests
- Add New
ScoreCollection
class - Add to all maialib classes:
- Add Python
__hash__
method - Add Python
__sizeof__
method
- Add Python
Chord
Class: AddgetNotes()
method
- Update Pybind11 to v2.9.2
- Better maialib objects representation inside the Python environment
Score::forEachNote()
callback contains more input parameters
Chord
class:- Add optional input argument:
.getIntervals(bool fromRoot = false)
- Add optional input argument:
.getStackIntervals(bool fromRoot = false)
- Add optional input argument:
- Trello: Cards and status updated
- Fix
Score::setRepeat()
default arguments - Fix
Note::transpose()
now works as expected
- Add
Note::getDuration()
as an alias toNote::getQuarterDuration()
- Add
Duration
enum class - Add
std::vector<std::string> Helper::midiNotes2pitches(int midiNote)
- Add
void Score::setRepeat(int measureStart, int measureEnd)
Chord
class:- Add
.getIntervals()
- Add
.getStackIntervals()
- Add
Note
constructor now receives aDuration
enum class as second parameterHelper::midiNotes2pitch()
if the user try to do something impossible, now this method returns an error
- Replace
Chord::getIntervalNames()
byChord::getIntervals()
Note
class- Add constructor overload to receive MIDI Numbers
- Add
.transpose()
- Add external
Cherno Instrumentor
profiler class. Load the outputprofile.json
file insidechrome://tracing/
Helper::midiNote2pitch()
- Add Makefile target:
make validate
- Run
cppcheck
static analyzer (optional dev dependency) - Run
cpplint
(optional dev dependency)
- Run
- Add
float Chord::getQuarterDuration()
Note
class:- Add
float getQuarterDuration()
- Add
std::string getType()
- Add
std::string getLongType()
- Add
std::string getShortType()
- Add
int getNumDots()
- Add
bool isDotted()
- Add
bool isDoubleDotted()
- Add
Note
class: abstract theticks
integer values and replace it torhythm figures
as stringsChord::getDuration()
now returns arhythm figure
as stringHelper::noteType2ticks()
Helper::ticks2NoteType()
- Add
Chord::removeDuplicateNotes()
Score::getChords()
- Add optional boolean config input argument:
includeUnpitched
- Add optional boolean config input argument: ``includeDuplicates`
- Replace optional default values:
minStack
: minimum value from2
to1
maxDuration
: maximum value fromquarter
tomaxima
- Add optional boolean config input argument:
- Update Doxygen documentation
- Update Trello status and cards
- Fix
Score::getChords()
input arguments:minDuration
andmaxDuration
- Add unit test to
Helper::ticks2noteType()
- Add
Chord::sortNotes()
Measure
Class- Add
.divisionsPerQuarterNoteChanged()
- Add
.setIsDivisionsPerQuarterNoteChanged()
- Add
- Performance: Add optimization flags to the build system
- Performance:
Score::getChords()
add database indexes to speed up queries - Performance:
Helper::ticks2noteType()
add GCC extension:case range
- Better code reading on
Score::loadXML()
- Move external utility functions to a new file called:
utils.h
- Fix
Score::getChords()
to support multipledivisionsPerQuarterNote
- Fix
cpp-tests
build - Move
divisionsPerQuarterNote
fromScore
toMeasure
class - Remove
divisionsPerQuarterNote
fromNote
class
- Rewrite:
Score::getChords()
- Mode
Continuos
- Mode
Same Attack
- Mode
- Add
Chord::getDurationTicks()
method - Add external dependency:
SQLiteCpp
- Add
BuildCache
as a optional development tool
VS Code
: Enablepretty-printing
forgdb
Helper::noteType2ticks()
fix uppercase strings
- Add
Measure::getNumber()
andMeasure::setNumber()
Score::toDataFrame()
- Now return more data and columns for index and objects
- Better performace
- Python default print for:
Part
andMeasure
objects
- Add
Note::getStaff()
- Add
Score::getPart(const std::string& partName)
overload - Add
Score::getPartNames()
- Add
Score::toDataFrame()
make dev
first uninstall the current installed Python module before start the new installation- Better
README.md
- Added a new test score:
test_multiple_instruments4.musicxml
- Python wrapper:
Helper::ticks2noteType()
andHelper::noteType2ticks
- tests-cpp:
CMakeLists.txt
to includemaiacore
library
- Part Class:
.getNumNotesOn()
.getNumNotesOff()
- Measure Class:
.getNumNotesOn()
.getNumNotesOff()
.getNoteOff()
- Note Class:
.isNoteOff()
- New
dist
folder structure - Added
maiapy
to this project
- Rename the compiled C++ output module from
maialib
tomaiacore
- Parallel build: dynamically count the max number of threads (
make jobs
) - Rename
Measure::getNumElements()
to.getNumNotes()
- Rename
Measure::getNote()
to.getNoteOn()
- Folder structure: Create a
core
folder separate the C++ side - Better
README.md
Makefile
: Added the newmake dev
- build and install the Python module- Update
pybin11_json.hpp
tov0.2.12
Score::Score
: Added astd::vector
constructor overloadMakefile
: Renamedmake test
tomake tests
- New build system using
make
commands - Parallel build:
make -j8
- Created a
test
folder for store Python unit tests - Maialib cross-platform installer:
make install
- Created VS Code Tasks to
build
,install
anddebug
code
- Add full support to enharmonic pitch values to
midiNote2pitch()
function - Update
pybind11
library tov2.9.0
- Update
nlohmann JSON
library fromv3.9.1
tov3.10.5
- Better folder tree structure
- Move pure maialib functions to
Helper
class static members - Move old
orq_functions.cpp
content toScore.cpp
- Remove unnecessary files
- Update doxygen file
- Add
make doc
to theMakefile
options - Moved old
mxml_files
folder totests/xml_examples
folder
Score::forEachNote()
now works as expectedmidiNote2pitch()
python wrapper default argument
- A optional callback function to the
Chord::isTonal()
method Score::forEachNote()
method
- Update
nlohmann::json
library to the v3.9.1 - Replace all
size_t
variables/arguments toint
to improve performance Score
constructor now can receive a list of parts as astd::initializer_list
Score::getChords()
include default arguments
Score::setMetronomeMark()
now works as expectedNote
constructor works for resttutorial/create_note_chords.ipynb
correct variable namesMeasure::getNote()
now return only notes and skip all restsMeasure::getElement()
now return notes and rests