diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2467e5c5..27a3eea7 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,13 +18,14 @@ cmake_minimum_required(VERSION 3.14)
project( sonivox
LANGUAGES C CXX
- VERSION 3.6.13.0
+ VERSION 3.6.14.0
)
# GoogleTest requires at least C++14
set(CMAKE_CXX_STANDARD 14)
+set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
-option(USE_44KHZ "Output 44100 Hz audio (instead of 22050 Hz)" TRUE)
+option(USE_44KHZ "Output 44100 Hz audio sample rate (instead of 22050 Hz)" TRUE)
option(USE_16BITS_SAMPLES "Use 16 bits samples (instead of 8 bit)" TRUE)
option(BUILD_SONIVOX_STATIC "Build the static library" TRUE)
option(BUILD_SONIVOX_SHARED "Build the shared library" TRUE)
@@ -33,8 +34,13 @@ option(BUILD_TESTING "Build the unit tests" TRUE)
option(CMAKE_POSITION_INDEPENDENT_CODE "Whether to create position-independent targets" TRUE)
set(MAX_VOICES 64 CACHE STRING "Maximum number of voices")
+include(CMakeDependentOption)
+cmake_dependent_option(BUILD_MANPAGE "Build the manpage of the example program" FALSE "BUILD_EXAMPLE" FALSE)
+
include(GNUInstallDirs)
+set(PROJECT_RELEASE_DATE "October 6, 2024")
+
if (BUILD_TESTING)
find_package(GTest CONFIG)
if (NOT GTest_FOUND)
diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt
index 3d210642..ce3e67e3 100644
--- a/example/CMakeLists.txt
+++ b/example/CMakeLists.txt
@@ -21,3 +21,39 @@ if (BUILD_SONIVOX_STATIC)
elseif (BUILD_SONIVOX_SHARED)
target_link_libraries ( sonivoxrender sonivox::sonivox )
endif()
+
+if (BUILD_MANPAGE)
+ if(NOT EXISTS ${PANDOC_EXECUTABLE})
+ find_program(PANDOC_EXECUTABLE pandoc)
+ mark_as_advanced(PANDOC_EXECUTABLE)
+ endif()
+
+ if (EXISTS ${PANDOC_EXECUTABLE})
+ set(_src ${CMAKE_CURRENT_SOURCE_DIR}/sonivoxrender.1.md)
+ if (NOT PROJECT_RELEASE_DATE)
+ unset(_date)
+ execute_process (
+ COMMAND bash -c "LANG=en;date +'%B %d, %Y'"
+ OUTPUT_VARIABLE _date
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ else()
+ set(_date ${PROJECT_RELEASE_DATE})
+ endif()
+ set(_footer "${PROJECT_NAME} ${PROJECT_VERSION}")
+ add_custom_command (
+ OUTPUT sonivoxrender.1
+ COMMAND ${PANDOC_EXECUTABLE} -s -t man -Vdate=${_date} -Vfooter=${_footer} ${_src} -o sonivoxrender.1
+ DEPENDS ${_src}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
+ VERBATIM
+ )
+ add_custom_target(manpage ALL DEPENDS sonivoxrender.1)
+ endif()
+else()
+ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/sonivoxrender.1 ${CMAKE_CURRENT_BINARY_DIR} COPYONLY)
+endif()
+
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/sonivoxrender.1
+ DESTINATION ${CMAKE_INSTALL_MANDIR}/man1
+)
diff --git a/example/sonivoxrender.1 b/example/sonivoxrender.1
new file mode 100644
index 00000000..4d8e7e0b
--- /dev/null
+++ b/example/sonivoxrender.1
@@ -0,0 +1,105 @@
+.\" Automatically generated by Pandoc 2.14.0.3
+.\"
+.TH "SONIVOXRENDER" "1" "October 6, 2024" "sonivox 3.6.14.0" "Sonivox MIDI File Renderer"
+.hy
+.SH NAME
+.PP
+\f[B]sonivoxrender\f[R] \[em] Render standard MIDI files into raw PCM
+audio
+.SH SYNOPSIS
+.PP
+\f[B]sonivoxrender\f[R] [\f[B]-h\f[R]] [\f[B]-d\f[R] \f[I]file.dls\f[R]]
+[\f[B]-r\f[R] \f[I]0..4\f[R]] [\f[B]-w\f[R] \f[I]0..32765\f[R]]
+\f[I]midi_file\f[R]
+.SH DESCRIPTION
+.PP
+This program is a MIDI file renderer based on the sonivox synthesizer
+library.
+It reads .MID (Standard MIDI Files) file format, and writes an audio
+stream to the standard output as raw 16 bit stereo PCM samples.
+.SS Options
+.TP
+-h
+Prints brief usage information.
+.TP
+-d \f[I]file.dls\f[R]
+Optional DLS soundfont file name.
+If not provided, it uses an internal embedded soundfont.
+.TP
+-r \f[I]reverb_preset\f[R]
+Reverb preset between 0 and 4: 0=no, 1=large hall, 2=hall, 3=chamber,
+4=room.
+.TP
+-w \f[I]reverb_wet\f[R]
+Reverb wet level between 0 and 32765.
+.SS Arguments
+.TP
+\f[I]midi_file\f[R]
+Input MID file name.
+.SH EXAMPLES
+.PP
+The following examples assume the default option USE_44KHZ=ON, which
+means an output sample rate = 44100 Hz.
+.PP
+Example 1: Render a MIDI file and save the rendered audio as a raw audio
+file:
+.IP
+.nf
+\f[C]
+$ sonivoxrender ants.mid > ants.pcm
+\f[R]
+.fi
+.PP
+Example 2: pipe the rendered audio thru the Linux ALSA \f[B]aplay\f[R]
+utility:
+.IP
+.nf
+\f[C]
+$ sonivoxrender ants.mid | aplay -c 2 -f S16_LE -r 44100
+\f[R]
+.fi
+.PP
+is equivalent to:
+.IP
+.nf
+\f[C]
+$ sonivoxrender ants.mid | aplay -f cd
+\f[R]
+.fi
+.PP
+Example 3: pipe the rendered audio thru the \f[B]lame\f[R] utility
+creating a MP3 file:
+.IP
+.nf
+\f[C]
+$ sonivoxrender ants.mid | lame -r -s 44100 - ants.mp3
+\f[R]
+.fi
+.PP
+Example 4: pipe the rendered audio thru the \f[B]sox\f[R] utility
+creating a WAV file:
+.IP
+.nf
+\f[C]
+$ sonivoxrender ants.mid | sox -t s16 -c 2 -r 44100 - ants.wav
+\f[R]
+.fi
+.PP
+Example 5: pipe the rendered audio thru the PulseAudio\[cq]s
+\f[B]pacat\f[R] utility:
+.IP
+.nf
+\f[C]
+$ sonivoxrender ants.mid | pacat
+\f[R]
+.fi
+.SH BUGS
+.PP
+See Tickets at GitHub
+.SH LICENSE AND COPYRIGHT
+.PP
+Licensed under the Apache License, Version 2.0
+.PP
+Copyright (c) 2022-2024 Pedro L\['o]pez-Cabanillas and contributors
+.SH AUTHORS
+Pedro L\['o]pez-Cabanillas .
diff --git a/example/sonivoxrender.1.md b/example/sonivoxrender.1.md
new file mode 100644
index 00000000..c0c380bb
--- /dev/null
+++ b/example/sonivoxrender.1.md
@@ -0,0 +1,77 @@
+% SONIVOXRENDER(1) sonivoxrender 0.0.0 | Sonivox MIDI File Renderer
+% Pedro López-Cabanillas
+
+# NAME
+
+**sonivoxrender** — Render standard MIDI files into raw PCM audio
+
+# SYNOPSIS
+
+| **sonivoxrender** [**-h**] [**-d** _file.dls_] [**-r** _0..4_] [**-w** _0..32765_] _midi_file_
+
+# DESCRIPTION
+
+This program is a MIDI file renderer based on the sonivox synthesizer library.
+It reads .MID (Standard MIDI Files) file format, and writes an audio stream to the standard output as raw 16 bit stereo PCM samples.
+
+## Options
+
+-h
+
+: Prints brief usage information.
+
+-d _file.dls_
+
+: Optional DLS soundfont file name. If not provided, it uses an internal embedded soundfont.
+
+-r _reverb_preset_
+
+: Reverb preset between 0 and 4: 0=no, 1=large hall, 2=hall, 3=chamber, 4=room.
+
+-w _reverb_wet_
+
+: Reverb wet level between 0 and 32765.
+
+## Arguments
+
+_midi_file_
+
+: Input MID file name.
+
+# EXAMPLES
+
+The following examples assume the default option USE_44KHZ=ON, which means an output sample rate = 44100 Hz.
+
+Example 1: Render a MIDI file and save the rendered audio as a raw audio file:
+
+ $ sonivoxrender ants.mid > ants.pcm
+
+Example 2: pipe the rendered audio thru the Linux ALSA **aplay** utility:
+
+ $ sonivoxrender ants.mid | aplay -c 2 -f S16_LE -r 44100
+
+is equivalent to:
+
+ $ sonivoxrender ants.mid | aplay -f cd
+
+Example 3: pipe the rendered audio thru the **lame** utility creating a MP3 file:
+
+ $ sonivoxrender ants.mid | lame -r -s 44100 - ants.mp3
+
+Example 4: pipe the rendered audio thru the **sox** utility creating a WAV file:
+
+ $ sonivoxrender ants.mid | sox -t s16 -c 2 -r 44100 - ants.wav
+
+Example 5: pipe the rendered audio thru the PulseAudio's **pacat** utility:
+
+ $ sonivoxrender ants.mid | pacat
+
+# BUGS
+
+See Tickets at GitHub
+
+# LICENSE AND COPYRIGHT
+
+Licensed under the Apache License, Version 2.0
+
+Copyright (c) 2022-2024 Pedro López-Cabanillas and contributors