mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-11 01:06:01 +03:00
b14a64b3c8
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;
|
|
}
|