Sha256: 29fda7e6a8807e69dfe29be89630ff41ae3432885256adb27c634f21c821d3ae

Contents?: true

Size: 1.67 KB

Versions: 2

Compression:

Stored size: 1.67 KB

Contents

#!/usr/bin/env ruby
# frozen_string_literal: true

# Copyright (c) 2018 Robert Haines.
#
# Licensed under the BSD License. See LICENCE for details.

require 'ffi/openmpt'

def get_filename(var)
  if var.nil?
    puts 'Please supply a filename to interrogate.'
    exit(1)
  end

  var.chomp
end

param = get_filename(ARGV[0])

if param == '--float'
  mod_path = get_filename(ARGV[1])
  float = true
else
  mod_path = param
  float = false
end

# Does this file exist? Is it readable?
unless ::File.readable?(mod_path)
  puts "'#{mod_path}' does not exist, or is not readable."
  exit(1)
end

# Can libopenmpt open this file?
unless ::FFI::OpenMPT.probe_file(mod_path)
  puts 'libopenmpt can not open this file. Are you sure it is a mod?'
  exit(1)
end

frames_per_read = 1_024
if float
  raw_type = 'float.raw'
  buffer = ::FFI::MemoryPointer.new(:float, frames_per_read * 2)
  method = :read_interleaved_float_stereo
else
  raw_type = 'int16.raw'
  buffer = ::FFI::MemoryPointer.new(:int16, frames_per_read * 2)
  method = :read_interleaved_stereo
end

puts
puts 'Ruby OpenMPT (ffi-openmpt) Mod to Raw PCM Converter.'
puts '----------------------------------------------------'
puts
puts "Filename...: #{::File.basename(mod_path)}"
puts "Size.......: #{::File.size(mod_path) / 1_024}k"

::FFI::OpenMPT::Module.open(mod_path) do |mod|
  puts "Type.......: #{mod.type}"
  puts "Output type: #{raw_type}"

  ::File.open(mod_path + '.' + raw_type, 'wb') do |file|
    loop do
      count = mod.send(method, frames_per_read, buffer)
      break if count == 0
      file.write(buffer.read_bytes(count * buffer.type_size * 2))
    end
  end
end

puts "Output size: #{::File.size(mod_path + '.' + raw_type) / 1_024}k"

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
ffi-openmpt-0.3.0 examples/mod-2-raw
ffi-openmpt-0.2.0 examples/mod-2-raw