/* * Copyright (c) 2018-2020, Andreas Kling * Copyright (c) 2019-2020, William McPherson * Copyright (c) 2021, kleines Filmröllchen * Copyright (c) 2022, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include "Music.h" #include #include #include #include #include #include #include using LibDSP::RollNote; using RollIter = AK::SinglyLinkedListIterator, RollNote>; class Track { AK_MAKE_NONCOPYABLE(Track); AK_MAKE_NONMOVABLE(Track); public: explicit Track(const u32& time); ~Track() = default; const Vector& recorded_sample() const { return m_recorded_sample; } const SinglyLinkedList& roll_notes(int note) const { return m_roll_notes[note]; } int volume() const { return m_volume; } NonnullRefPtr synth() { return m_synth; } NonnullRefPtr delay() { return m_delay; } void fill_sample(Sample& sample); void reset(); String set_recorded_sample(StringView path); void set_roll_note(int note, u32 on_sample, u32 off_sample); void set_keyboard_note(int note, Switch state); void set_volume(int volume); private: Audio::Sample recorded_sample(size_t note); void sync_roll(int note); Vector m_recorded_sample; int m_volume; const u32& m_time; NonnullRefPtr m_temporary_transport; NonnullRefPtr m_delay; NonnullRefPtr m_synth; SinglyLinkedList m_roll_notes[note_count]; RollIter m_roll_iterators[note_count]; Array, note_count> m_keyboard_notes; };