mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-01-15 13:06:10 +00:00
Almost all synthesizer code in Piano is removed in favor of the LibDSP reimplementation. This causes some issues that mainly have to do with the way Piano currently handles talking to LibDSP. Additionally, the sampler is gone for now and will be reintroduced with future work.
98 lines
2.1 KiB
C++
98 lines
2.1 KiB
C++
/*
|
|
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
|
* Copyright (c) 2019-2020, William McPherson <willmcpherson2@gmail.com>
|
|
* Copyright (c) 2021, JJ Roberts-White <computerfido@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include "TrackManager.h"
|
|
#include "Applications/Piano/Music.h"
|
|
|
|
TrackManager::TrackManager()
|
|
{
|
|
add_track();
|
|
}
|
|
|
|
TrackManager::~TrackManager()
|
|
{
|
|
}
|
|
|
|
void TrackManager::time_forward(int amount)
|
|
{
|
|
int new_value = (static_cast<int>(m_time) + amount) % roll_length;
|
|
|
|
if (new_value < 0) { // If the new time value is negative add roll_length to wrap around
|
|
m_time = roll_length + new_value;
|
|
} else {
|
|
m_time = new_value;
|
|
}
|
|
}
|
|
|
|
void TrackManager::fill_buffer(Span<Sample> buffer)
|
|
{
|
|
memset(buffer.data(), 0, buffer_size);
|
|
|
|
for (size_t i = 0; i < buffer.size(); ++i) {
|
|
for (auto& track : m_tracks)
|
|
track->fill_sample(buffer[i]);
|
|
|
|
if (++m_time >= roll_length) {
|
|
m_time = 0;
|
|
if (!m_should_loop)
|
|
break;
|
|
}
|
|
}
|
|
|
|
memcpy(m_current_back_buffer.data(), buffer.data(), buffer_size);
|
|
swap(m_current_front_buffer, m_current_back_buffer);
|
|
}
|
|
|
|
void TrackManager::reset()
|
|
{
|
|
memset(m_front_buffer.data(), 0, buffer_size);
|
|
memset(m_back_buffer.data(), 0, buffer_size);
|
|
|
|
m_current_front_buffer = m_front_buffer.span();
|
|
m_current_back_buffer = m_back_buffer.span();
|
|
|
|
m_time = 0;
|
|
|
|
for (auto& track : m_tracks)
|
|
track->reset();
|
|
}
|
|
|
|
void TrackManager::set_keyboard_note(int note, Switch note_switch)
|
|
{
|
|
m_tracks[m_current_track]->set_keyboard_note(note, note_switch);
|
|
}
|
|
|
|
void TrackManager::set_octave(Direction direction)
|
|
{
|
|
if (direction == Up) {
|
|
if (m_octave < octave_max)
|
|
++m_octave;
|
|
} else {
|
|
if (m_octave > octave_min)
|
|
--m_octave;
|
|
}
|
|
}
|
|
|
|
void TrackManager::set_octave(int octave)
|
|
{
|
|
if (octave <= octave_max && octave >= octave_min) {
|
|
m_octave = octave;
|
|
}
|
|
}
|
|
|
|
void TrackManager::add_track()
|
|
{
|
|
m_tracks.append(make<Track>(m_time));
|
|
}
|
|
|
|
void TrackManager::next_track()
|
|
{
|
|
if (++m_current_track >= m_tracks.size())
|
|
m_current_track = 0;
|
|
}
|