Skip to content

Commit

Permalink
sfizz_render without sndfile
Browse files Browse the repository at this point in the history
  • Loading branch information
jpcima committed Mar 23, 2021
1 parent 5610c2e commit b0e4fb3
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 10 deletions.
2 changes: 1 addition & 1 deletion clients/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ endif()

if(SFIZZ_RENDER)
add_executable(sfizz_render MidiHelpers.h sfizz_render.cpp)
target_link_libraries(sfizz_render PRIVATE sfizz::internal sfizz::fmidi sfizz::sndfile sfizz::cxxopts)
target_link_libraries(sfizz_render PRIVATE sfizz::internal sfizz::fmidi sfizz::cxxopts st_audiofile_formats)
sfizz_enable_lto_if_needed(sfizz_render)
install(TARGETS sfizz_render DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT "render" OPTIONAL)
endif()
31 changes: 23 additions & 8 deletions clients/sfizz_render.cpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@

#include <sndfile.hh>
#include "sfizz/Synth.h"
#include "sfizz/MathHelpers.h"
#include "sfizz/SfzHelpers.h"
#include "sfizz/SIMDHelpers.h"
#include "MidiHelpers.h"
#include "cxxopts.hpp"
#include <st_audiofile_libs.h>
#include <cxxopts.hpp>
#include <fmidi/fmidi.h>
#include <iostream>

Expand Down Expand Up @@ -158,14 +158,27 @@ int main(int argc, char** argv)
LOG_INFO("-- Cutting the rendering at the last MIDI End of Track message");
}

SndfileHandle outputFile (outputPath.u8string(), SFM_WRITE, SF_FORMAT_WAV | SF_FORMAT_PCM_16, 2, sampleRate);
ERROR_IF(outputFile.error() != 0, "Error writing out the wav file: " << outputFile.strError());
drwav outputFile;
drwav_data_format outputFormat {};
outputFormat.container = drwav_container_riff;
outputFormat.format = DR_WAVE_FORMAT_PCM;
outputFormat.channels = 2;
outputFormat.sampleRate = sampleRate;
outputFormat.bitsPerSample = 16;

#if !defined(_WIN32)
drwav_bool32 outputFileOk = drwav_init_file_write(&outputFile, outputPath.c_str(), &outputFormat, nullptr);
#else
drwav_bool32 outputFileOk = drwav_init_file_write_w(&outputFile, outputPath.c_str(), &outputFormat, nullptr);
#endif
ERROR_IF(!outputFileOk, "Error opening the wav file for writing");

auto sampleRateDouble = static_cast<double>(sampleRate);
const double increment { 1.0 / sampleRateDouble };
int numFramesWritten { 0 };
uint64_t numFramesWritten { 0 };
sfz::AudioBuffer<float> audioBuffer { 2, blockSize };
sfz::Buffer<float> interleavedBuffer { 2 * blockSize };
sfz::Buffer<int16_t> interleavedPcm { 2 * blockSize };

fmidi_player_u midiPlayer { fmidi_player_new(midiFile.get()) };
CallbackData callbackData { synth, 0, false };
Expand All @@ -178,20 +191,22 @@ int main(int argc, char** argv)
fmidi_player_tick(midiPlayer.get(), increment);
synth.renderBlock(audioBuffer);
sfz::writeInterleaved(audioBuffer.getConstSpan(0), audioBuffer.getConstSpan(1), absl::MakeSpan(interleavedBuffer));
numFramesWritten += outputFile.writef(interleavedBuffer.data(), blockSize);
drwav_f32_to_s16(interleavedPcm.data(), interleavedBuffer.data(), 2 * blockSize);
numFramesWritten += drwav_write_pcm_frames(&outputFile, blockSize, interleavedPcm.data());
}

if (!useEOT) {
auto averagePower = sfz::meanSquared<float>(interleavedBuffer);
while (averagePower > 1e-12f) {
synth.renderBlock(audioBuffer);
sfz::writeInterleaved(audioBuffer.getConstSpan(0), audioBuffer.getConstSpan(1), absl::MakeSpan(interleavedBuffer));
numFramesWritten += outputFile.writef(interleavedBuffer.data(), blockSize);
drwav_f32_to_s16(interleavedPcm.data(), interleavedBuffer.data(), 2 * blockSize);
numFramesWritten += drwav_write_pcm_frames(&outputFile, blockSize, interleavedPcm.data());
averagePower = sfz::meanSquared<float>(interleavedBuffer);
}
}

outputFile.writeSync();
drwav_uninit(&outputFile);
LOG_INFO("Wrote " << numFramesWritten << " frames of sound data in" << outputPath.string());

return 0;
Expand Down
2 changes: 1 addition & 1 deletion cmake/SfizzDeps.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ add_library(sfizz::cxxopts ALIAS sfizz_cxxopts)
target_include_directories(sfizz_cxxopts INTERFACE "external/cxxopts")

# The sndfile library
if(SFIZZ_USE_SNDFILE OR SFIZZ_DEMOS OR SFIZZ_DEVTOOLS OR SFIZZ_BENCHMARKS OR SFIZZ_RENDER)
if(SFIZZ_USE_SNDFILE OR SFIZZ_DEMOS OR SFIZZ_DEVTOOLS OR SFIZZ_BENCHMARKS)
add_library(sfizz_sndfile INTERFACE)
add_library(sfizz::sndfile ALIAS sfizz_sndfile)
if(SFIZZ_USE_VCPKG OR CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
Expand Down

0 comments on commit b0e4fb3

Please sign in to comment.