A ruby interface to libopenmpt - part of OpenMPT.
See the libopenmpt homepage for more information.
You must have libopenmpt installed. On Ubuntu this is done with:
$ sudo apt install libopenmpt0You do not need the libopenmpt development libraries to be installed. If this library fails to find libopenmpt on your platform it might be due to it being named something slightly different. Please raise an issue to let me know.
Instructions for installing libopenmpt from source are available on the libopenmpt homepage.
This library uses Ruby FFI (foreign function interface) to wrap the C API for libopenmpt. It will be installed automatically if you install this package via Ruby Gems, otherwise:
$ gem install ffiwill do the trick.
Add ffi-openmpt to your .gemspec or Gemfile as appropriate, or install directly from Ruby Gems:
$ gem install ffi-openmptThe library wraps the C libopenmpt API directly: methods have the same name and signature as their C counterparts. A more friendly ruby-like interface is also available, which hides the FFI details as much as possible.
Not all libopenmpt methods are wrapped yet, but enough functionality is supplied to load a module, interogate it and render it to a PCM stream.
libopenmpt manages the memory of any strings it returns. This means that you must free up such memory explicitly after you have finished with them when using the C API. Such strings are returned to ruby as FFI::Pointer objects, so the string value can be copied to a ruby string as follows:
begin
ptr = FFI::OpenMPT::API.openmpt_get_string('url')
str = ptr.read_string
ensure
FFI::OpenMPT::API.openmpt_free_string(ptr)
end
puts strThe ruby interface handles all this for you:
str = FFI::OpenMPT::String.get(:url)
puts strScripts in the examples directory show how to use both the C and ruby APIs. You will need to make sure that ffi-openmpt is on your RUBYLIB path, or run the examples with bundle exec.
Display information about a mod file, for example:
$ ./mod-info lastsun.mod
Ruby OpenMPT (ffi-openmpt) file interrogator.
---------------------------------------------
Filename...: lastsun.mod
Size.......: 106k
Type.......: mod
Format.....: Generic Amiga / PC MOD file
Tracker....: Master Soundtracker 1.0
Title......: the last sun
Duration...: 3:56.4
Subsongs...: 1
Channels...: 4
Orders.....: 35
Patterns...: 20
Intruments.: 0
Samples....: 15Both mod-info and mod-info-api output exactly the same data. mod-info uses the ruby interface, and mod-info-api uses the mapped libopenmpt C API directly.
Render a mod to a raw stereo PCM file. Use the --float switch to generate 32 bit float data, or omit for 16bit int data. For example:
$ ./mod-2-raw --float lastsun.mod
Ruby OpenMPT (ffi-openmpt) Mod to Raw PCM Converter.
----------------------------------------------------
Filename...: lastsun.mod
Size.......: 106k
Type.......: mod
Output type: float.raw
Output size: 88687kThe raw output format is simply a blob of float or short data. The left and right stereo channels are interleaved. The sample rate used is 48,000Hz.
Until this library reaches version 1.0.0 the API may be subject to breaking changes. When version 1.0.0 is released, then the principles of semantic versioning will be applied.
The Ruby OpenMPT code (ffi-openmpt) is released under the BSD licence.
Copyright (c) 2018-2021, Robert Haines All rights reserved.
See LICENCE for more details.
For testing purposes, this library uses and distributes 'The Last Sun' by Frederic Hahn. It is believed to be in the Public Domain, but if this is not the case please raise an issue to let me know.