Skip to content

thelowsunoverthemoon/mahler.c

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

mahler.c

GitHub Workflow Status (with event) Static Badge Stack Overflow Badge Static Badge

Simple library for Western music theory in C99

Features

  • Small & Easy-to-use
  • Interval, Chord, Scale, and Key Signature functions
  • No Internal Memory Allocation
  • Supports Theoretical Keys (eg Fb+)
  • No Accidental Limit (eg G 20th sharp)
  • Enharmonically Correct (eg minor 6th of D is Bb, not A#)
  • 100% Test Coverage

Example

Here's an example that creates the C4 Blues Scale, ascending:

struct mah_note notes[7];
struct mah_scale scale = mah_get_scale(
    (struct mah_note) {MAH_C, MAH_NATURAL, 4}, &MAH_BLUES_SCALE, notes, MAH_ASCEND, NULL
);

And if you want to print it:

char buf[MAH_DISP_LEN];
for (int i = 0; i < scale.size; i++) {
    puts(mah_write_note(scale.notes[i], buf, MAH_DISP_LEN, NULL));
}

See here for more!

Who's Mahler?

Gustav Mahler is one of my favourite composers; if you like the emotions of Wagner, and the ideas of Stravinsky, Mahler is the perfect middle ground! All his works have a flair of modernism that gives his emotional works a unique touch. You should definitely check him out, especially his Symphony No.5 in C# Minor, The Song of the Earth, and Symphony No.6 in A Minor.

Documentation

See here!

Unit Tests

See here!

Compiling

To compile, you can use cmake. Be sure to include the src and inc folders as folders to search for the source and header. For example, given example.c and mahler is located in the same directory

cmake_minimum_required(VERSION 3.10)
project(example)
set(MAHLER_PATH "${PROJECT_SOURCE_DIR}/mahler.c")

add_executable(${PROJECT_NAME} ${PROJECT_NAME}.c)
target_include_directories(
    ${PROJECT_NAME} PUBLIC
    "${PROJECT_BINARY_DIR}"
    "${MAHLER_PATH}/inc"
    "${MAHLER_PATH}/src"
)

add_subdirectory(${MAHLER_PATH})
target_link_libraries(${PROJECT_NAME} PUBLIC mahler)

where MAHLER_PATH is the path to mahler. It is also simple to compile via commandline.