13 ProjectImplP project = ProjectImpl::create (
"TestProject");
16 TASSERT (project->name() ==
"TestProject");
18 const double initial_bpm = project->bpm();
19 TASSERT (initial_bpm >= 10.0 && initial_bpm <= 999.0);
21 auto bpm_connection = project->on_event (
"notify:bpm", [&bpm_notifications] (
const Event &event) { bpm_notifications++; });
24 auto name_connection = project->on_event (
"notify:name", [&name_notifications] (
const Event &event) { name_notifications++; });
27 auto volume_connection = project->on_event (
"notify:master_volume", [&volume_notifications] (
const Event &event) { volume_notifications++; });
29 const double initial_vol = project->master_volume();
30 TASSERT (initial_vol >= -100.0 && initial_vol <= 20.0);
34 TASSERT (std::abs (project->bpm() - 130.0) < 0.001);
35 uint64_t last_bpm_notifications = bpm_notifications;
37 TASSERT (std::abs (project->bpm() - 123.0) < 0.001);
38 TASSERT (bpm_notifications > last_bpm_notifications);
43 last_bpm_notifications = bpm_notifications;
47 TASSERT (std::abs (project->bpm() - initial_bpm) < 0.001);
48 TASSERT (bpm_notifications > last_bpm_notifications);
50 last_bpm_notifications = bpm_notifications;
54 TASSERT (std::abs (project->bpm() - 123.0) < 0.001);
55 TASSERT (bpm_notifications > last_bpm_notifications);
60 TASSERT (std::abs (project->bpm() - initial_bpm) < 0.001);
63 const String initial_name = project->name();
64 TASSERT (initial_name ==
"TestProject");
65 uint64_t last_name_notifications = name_notifications;
66 project->name (
"NewName");
67 TASSERT (project->name() ==
"NewName");
68 TASSERT (name_notifications > last_name_notifications);
71 last_name_notifications = name_notifications;
73 TASSERT (project->name() == initial_name);
75 TASSERT (name_notifications > last_name_notifications);
77 last_name_notifications = name_notifications;
79 TASSERT (project->name() ==
"NewName");
80 TASSERT (name_notifications > last_name_notifications);
83 uint64_t last_volume_notifications = volume_notifications;
84 project->master_volume (-6.0);
85 TASSERT (std::abs (project->master_volume() - (-6.0)) < 0.01);
86 TASSERT (volume_notifications > last_volume_notifications);
89 last_volume_notifications = volume_notifications;
91 TASSERT (std::abs (project->master_volume() - initial_vol) < 0.01);
93 TASSERT (volume_notifications > last_volume_notifications);
95 last_volume_notifications = volume_notifications;
97 TASSERT (std::abs (project->master_volume() - (-6.0)) < 0.01);
98 TASSERT (volume_notifications > last_volume_notifications);
100 project->_deactivate();
104 ProjectImplP project2 = ProjectImpl::create (
"TestProject2");
105 project2->name (
"foo");
106 TASSERT (project2->name() ==
"foo");
107 project2->name (
"bar");
108 TASSERT (project2->name() ==
"bar");
116 ProjectImplP project = ProjectImpl::create (
"LengthTest");
118 project->_activate();
120 double len = project->length();
123 project->_deactivate();
129project_track_management()
131 ProjectImplP project = ProjectImpl::create (
"TrackTest");
133 project->_activate();
135 TrackS tracks = project->all_tracks();
136 const size_t initial_count = tracks.size();
139 TrackP new_track = project->create_track();
142 tracks = project->all_tracks();
143 TASSERT (tracks.size() == initial_count + 1);
145 project->_deactivate();
151project_playback_state()
153 ProjectImplP project = ProjectImpl::create (
"PlaybackTest");
155 project->_activate();
158 TASSERT (!project->is_playing());
160 project->_deactivate();
168 ProjectImplP project = ProjectImpl::create (
"TrackMuteSoloTest");
170 project->_activate();
172 TrackP track = project->create_track();
181 auto muted_connection = track->on_event (
"notify:muted", [&muted_notifications] (
const Event &event) { muted_notifications++; });
184 auto solo_connection = track->on_event (
"notify:solo", [&solo_notifications] (
const Event &event) { solo_notifications++; });
187 uint64_t last_muted_notifications = muted_notifications;
188 track->set_muted (
true);
190 TASSERT (muted_notifications > last_muted_notifications);
193 last_muted_notifications = muted_notifications;
194 track->set_muted (
false);
196 TASSERT (muted_notifications > last_muted_notifications);
199 uint64_t last_solo_notifications = solo_notifications;
200 track->set_solo (
true);
202 TASSERT (solo_notifications > last_solo_notifications);
205 last_solo_notifications = solo_notifications;
206 track->set_solo (
false);
208 TASSERT (solo_notifications > last_solo_notifications);
210 project->_deactivate();
218 ProjectImplP project = ProjectImpl::create (
"TrackUndoRedoTest");
220 project->_activate();
222 TrackP track = project->create_track();
227 auto volume_connection = track->on_event (
"notify:volume", [&volume_notifications] (
const Event &event) { volume_notifications++; });
230 auto pan_connection = track->on_event (
"notify:pan", [&pan_notifications] (
const Event &event) { pan_notifications++; });
233 uint64_t last_volume_notifications = volume_notifications;
234 track->volume (-6.0);
235 TASSERT (std::abs (track->volume() - (-6.0)) < 0.01);
236 TASSERT (volume_notifications > last_volume_notifications);
239 last_volume_notifications = volume_notifications;
241 TASSERT (std::abs (track->volume()) < 0.01);
242 TASSERT (volume_notifications > last_volume_notifications);
245 uint64_t last_pan_notifications = pan_notifications;
247 TASSERT (std::abs (track->pan() - 0.5) < 0.01);
248 TASSERT (pan_notifications > last_pan_notifications);
251 last_pan_notifications = pan_notifications;
253 TASSERT (std::abs (track->pan() - (-0.5)) < 0.01);
254 TASSERT (pan_notifications > last_pan_notifications);
256 project->_deactivate();
264 ProjectImplP project = ProjectImpl::create (
"TrackVolumePanTest");
266 project->_activate();
268 TrackP track = project->create_track();
272 double initial_vol = track->volume();
273 TASSERT (initial_vol >= -100.0 && initial_vol <= 20.0);
277 auto volume_connection = track->on_event (
"notify:volume", [&volume_notifications] (
const Event &event) { volume_notifications++; });
280 auto pan_connection = track->on_event (
"notify:pan", [&pan_notifications] (
const Event &event) { pan_notifications++; });
283 uint64_t last_volume_notifications = volume_notifications;
284 track->volume (-6.0);
285 TASSERT (std::abs (track->volume() - (-6.0)) < 0.01);
286 TASSERT (volume_notifications > last_volume_notifications);
289 last_volume_notifications = volume_notifications;
291 TASSERT (std::abs (track->volume()) < 0.01);
292 TASSERT (volume_notifications > last_volume_notifications);
295 double initial_pan = track->pan();
296 TASSERT (initial_pan >= -1.0 && initial_pan <= 1.0);
299 uint64_t last_pan_notifications = pan_notifications;
301 TASSERT (std::abs (track->pan() - 0.5) < 0.01);
302 TASSERT (pan_notifications > last_pan_notifications);
305 last_pan_notifications = pan_notifications;
307 TASSERT (std::abs (track->pan() - (-0.5)) < 0.01);
308 TASSERT (pan_notifications > last_pan_notifications);
310 project->_deactivate();
318 ProjectImplP project = ProjectImpl::create (
"TrackNameTest");
320 project->_activate();
322 TrackP track = project->create_track();
326 track->name (
"MyTrack");
327 TASSERT (track->name() ==
"MyTrack");
329 track->name (
"AnotherName");
330 TASSERT (track->name() ==
"AnotherName");
332 project->_deactivate();
340 ProjectImplP project = ProjectImpl::create (
"ClipTest");
342 project->_activate();
344 TrackP track = project->create_track();
350 ClipImplP clip = trackimpl->create_midi_clip (
"TestClip", 0.0, 4.0);
353 project->_deactivate();
361 ProjectImplP project = ProjectImpl::create (
"ClipNotesTest");
363 project->_activate();
365 TrackP track = project->create_track();
371 ClipImplP clip = trackimpl->create_midi_clip (
"NotesClip", 0.0, 4.0);
374 ClipNoteS notes = clip->list_all_notes();
386 batch.push_back (note);
387 clip->change_batch (batch,
"Add Note");
389 notes = clip->list_all_notes();
393 project->_deactivate();
401 ProjectImplP project = ProjectImpl::create (
"ClipRangeTest");
403 project->_activate();
405 TrackP track = project->create_track();
411 ClipImplP clip = trackimpl->create_midi_clip (
"RangeClip", 0.0, 4.0);
414 int64 start = clip->start_tick();
415 int64 stop = clip->stop_tick();
419 clip->assign_range (start + 960, stop + 960);
420 TASSERT (clip->start_tick() == start + 960);
422 project->_deactivate();
428clip_mute_volume_pan()
430 ProjectImplP project = ProjectImpl::create (
"ClipMuteVolPanTest");
432 project->_activate();
434 TrackP track = project->create_track();
441 ClipImplP mclip = trackimpl->create_midi_clip (
"MidiClip", 0.0, 4.0);
449 auto muted_connection = mclip->on_event (
"notify:muted", [&muted_notifications] (
const Event &event) { muted_notifications++; });
452 uint64_t last_muted_notifications = muted_notifications;
453 mclip->set_muted (
true);
455 TASSERT (muted_notifications > last_muted_notifications);
458 last_muted_notifications = muted_notifications;
459 mclip->set_muted (
false);
461 TASSERT (muted_notifications > last_muted_notifications);
465 auto volume_connection = mclip->on_event (
"notify:volume", [&volume_notifications] (
const Event &event) { volume_notifications++; });
468 uint64_t last_volume_notifications = volume_notifications;
469 mclip->volume (-6.0);
470 TASSERT (std::abs (mclip->volume() - (-6.0)) < 0.01);
471 TASSERT (volume_notifications > last_volume_notifications);
474 last_volume_notifications = volume_notifications;
476 TASSERT (std::abs (mclip->volume()) < 0.01);
477 TASSERT (volume_notifications > last_volume_notifications);
480 ClipImplP aclip = trackimpl->create_audio_clip (
"AudioClip", 0.0, 4.0);
485 auto pan_connection = aclip->on_event (
"notify:pan", [&pan_notifications] (
const Event &event) { pan_notifications++; });
488 TASSERT (std::abs (aclip->pan()) < 0.01);
491 uint64_t last_pan_notifications = pan_notifications;
493 TASSERT (std::abs (aclip->pan() - 0.5) < 0.01);
494 TASSERT (pan_notifications > last_pan_notifications);
497 last_pan_notifications = pan_notifications;
499 TASSERT (std::abs (aclip->pan() - (-0.5)) < 0.01);
500 TASSERT (pan_notifications > last_pan_notifications);
503 uint64_t audio_volume_notifications = 0;
504 auto audio_volume_connection = aclip->on_event (
"notify:volume", [&audio_volume_notifications] (
const Event &event) { audio_volume_notifications++; });
506 last_volume_notifications = audio_volume_notifications;
507 aclip->volume (-3.0);
508 TASSERT (std::abs (aclip->volume() - (-3.0)) < 0.01);
509 TASSERT (audio_volume_notifications > last_volume_notifications);
511 project->_deactivate();
519 ProjectImplP project = ProjectImpl::create (
"ClipUndoRedoTest");
521 project->_activate();
523 TrackP track = project->create_track();
530 ClipImplP mclip = trackimpl->create_midi_clip (
"UndoMidiClip", 0.0, 4.0);
534 auto muted_connection = mclip->on_event (
"notify:muted", [&muted_notifications] (
const Event &event) { muted_notifications++; });
537 mclip->set_muted (
true);
539 uint64_t last_muted_notifications = muted_notifications;
553 auto volume_connection = mclip->on_event (
"notify:volume", [&volume_notifications] (
const Event &event) { volume_notifications++; });
556 double initial_vol = mclip->volume();
557 uint64_t last_volume_notifications = volume_notifications;
558 mclip->volume (-12.0);
559 TASSERT (std::abs (mclip->volume() - (-12.0)) < 0.01);
564 TASSERT (std::abs (mclip->volume() - initial_vol) < 0.01);
569 TASSERT (std::abs (mclip->volume() - (-12.0)) < 0.01);
572 ClipImplP aclip = trackimpl->create_audio_clip (
"UndoAudioClip", 0.0, 4.0);
576 auto pan_connection = aclip->on_event (
"notify:pan", [&pan_notifications] (
const Event &event) { pan_notifications++; });
579 double initial_pan = aclip->pan();
580 uint64_t last_pan_notifications = pan_notifications;
582 TASSERT (std::abs (aclip->pan() - 0.8) < 0.01);
587 TASSERT (std::abs (aclip->pan() - initial_pan) < 0.01);
592 TASSERT (std::abs (aclip->pan() - 0.8) < 0.01);
603 batch.push_back (note);
606 auto notes_connection = mclip->on_event (
"notify:notes", [¬es_notifications] (
const Event &event) { notes_notifications++; });
609 uint64_t last_notes_notifications = notes_notifications;
610 mclip->change_batch (batch,
"Add Note");
611 TASSERT (mclip->list_all_notes().size() == 1);
616 TASSERT (mclip->list_all_notes().empty());
621 TASSERT (mclip->list_all_notes().size() == 1);
624 int64 initial_start = mclip->start_tick();
625 int64 initial_stop = mclip->stop_tick();
629 auto range_connection = mclip->on_event (
"notify:start_tick", [&range_notifications] (
const Event &event) { range_notifications++; });
631 uint64_t last_range_notifications = range_notifications;
632 mclip->assign_range (initial_start + 960, initial_stop + 960);
633 TASSERT (mclip->start_tick() == initial_start + 960);
634 TASSERT (range_notifications > last_range_notifications);
639 TASSERT (mclip->start_tick() == initial_start);
640 TASSERT (mclip->stop_tick() == initial_stop);
645 TASSERT (mclip->start_tick() == initial_start + 960);
646 TASSERT (mclip->stop_tick() == initial_stop + 960);
648 project->_deactivate();
The Anklang C++ API namespace.
int64_t int64
A 64-bit unsigned integer, use PRI*64 in format strings.
Part specific note event representation.
int64 tick
UI selection flag.
float velocity
Duration in number of ticks.
int64 duration
Position in ticks.
Structure for callback based notifications.
#define TASSERT(cond)
Unconditional test assertion, enters breakpoint if not fullfilled.
#define TEST_ADD(fun)
Register a function to run as part of the unit test suite.