From 0fb87d18189c4fbb794a4c012c6dfcd49419cce0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Doar=C3=A9?= Date: Tue, 4 Mar 2025 15:02:39 +0100 Subject: [PATCH 1/4] Scale:circle_of_5ths_rotate --- scale.lua | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/scale.lua b/scale.lua index adc55b1..640d23d 100644 --- a/scale.lua +++ b/scale.lua @@ -106,6 +106,22 @@ function Scale:to_the_right_on_circle_of_5ths(iterations) :to_the_right_on_circle_of_5ths(iterations -1) end +--[[ + Warning: only works for ionian scales +]] +function Scale:circle_of_5ths_rotate(iterations) + if(iterations == 0) then + return self + elseif(iterations < 0) then + return self:to_the_left_on_circle_of_5ths(-iterations) + elseif(iterations > 0) then + return self:to_the_right_on_circle_of_5ths(iterations) + else + return "Error" + end +end + + --[[ Returns a new scale based on self, rotated from note_offset note_offset: From e0cb0bd2591f371316111010be683c2dd925dbc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Doar=C3=A9?= Date: Tue, 4 Mar 2025 15:03:30 +0100 Subject: [PATCH 2/4] ChordBuilder:extend --- chord.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/chord.lua b/chord.lua index 34e5518..51d62da 100644 --- a/chord.lua +++ b/chord.lua @@ -336,6 +336,20 @@ function ChordBuilder:clone() return b end +-- extensions is a table of 4 elements, each element being either 0 or 1 or false or true +-- the first element is the seventh, +-- the second is the ninth, +-- the third is the eleventh, +-- the fourth is the thirteenth +function ChordBuilder:extend(extensions) + local b = self:clone() + b.seventh = (extensions[1]==1 or extensions[1]==true) + b.ninth = (extensions[2]==1 or extensions[2]==true) + b.eleventh = (extensions[3]==1 or extensions[3]==true) + b.thirteenth = (extensions[4]==1 or extensions[4]==true) + return b +end + function ChordBuilder:withSeventh() local b = self:clone() b.seventh = true From 19581928d8600032ef53b977a55ed6ea62f2d1ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Doar=C3=A9?= Date: Tue, 25 Mar 2025 19:31:36 +0100 Subject: [PATCH 3/4] Test file for circle of 5ths --- run_utests.lua | 3 ++- test/test-circleof5ths.lua | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 test/test-circleof5ths.lua diff --git a/run_utests.lua b/run_utests.lua index 216cd66..ca6678b 100644 --- a/run_utests.lua +++ b/run_utests.lua @@ -12,5 +12,6 @@ require('test/tracks/test_clip') require('test/tracks/test_clip_array') require('test/tracks/test_event') require('test/tracks/test_event_array') +require('test/test-circleof5ths') -os.exit( lu.LuaUnit.run() ) \ No newline at end of file +os.exit( lu.LuaUnit.run() ) diff --git a/test/test-circleof5ths.lua b/test/test-circleof5ths.lua new file mode 100644 index 0000000..2b7e1b5 --- /dev/null +++ b/test/test-circleof5ths.lua @@ -0,0 +1,36 @@ +require('../scale') +require('../note') +require('../mode') +luaunit = require('luaunit') + +TestCircleOf5ths = {} + +function TestCircleOf5ths:setUp() +end + +function TestCircleOf5ths:tearDown() +end + +function TestCircleOf5ths:test_totheleft() + local c_major = Scale.c_major() + local next = c_major:to_the_left_on_circle_of_5ths(1) + -- print(next:tostring()) + for i=1,11 do + print(i+1) + next = next:to_the_left_on_circle_of_5ths(1) + -- print(next:tostring()) + end + luaunit.assertEquals(next, Scale.c_major()) +end + +function TestCircleOf5ths:test_totheright() + local c_major = Scale.c_major() + local next = c_major:to_the_right_on_circle_of_5ths(1) + -- print(next:tostring()) + for i=1,11 do + print(i+1) + next = next:to_the_right_on_circle_of_5ths(1) + -- print(next:tostring()) + end + luaunit.assertEquals(next, Scale.c_major()) +end From 42cbe7f80cf64997f4c243c0ab81b2e45da4e880 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Doar=C3=A9?= Date: Tue, 25 Mar 2025 21:16:35 +0100 Subject: [PATCH 4/4] Test of circle of 5ths in test_scale.lua --- run_utests.lua | 1 - test/test-circleof5ths.lua | 36 ------------------------------------ test/test_scale.lua | 24 +++++++++++++++++++++++- 3 files changed, 23 insertions(+), 38 deletions(-) delete mode 100644 test/test-circleof5ths.lua diff --git a/run_utests.lua b/run_utests.lua index ca6678b..3de019d 100644 --- a/run_utests.lua +++ b/run_utests.lua @@ -12,6 +12,5 @@ require('test/tracks/test_clip') require('test/tracks/test_clip_array') require('test/tracks/test_event') require('test/tracks/test_event_array') -require('test/test-circleof5ths') os.exit( lu.LuaUnit.run() ) diff --git a/test/test-circleof5ths.lua b/test/test-circleof5ths.lua deleted file mode 100644 index 2b7e1b5..0000000 --- a/test/test-circleof5ths.lua +++ /dev/null @@ -1,36 +0,0 @@ -require('../scale') -require('../note') -require('../mode') -luaunit = require('luaunit') - -TestCircleOf5ths = {} - -function TestCircleOf5ths:setUp() -end - -function TestCircleOf5ths:tearDown() -end - -function TestCircleOf5ths:test_totheleft() - local c_major = Scale.c_major() - local next = c_major:to_the_left_on_circle_of_5ths(1) - -- print(next:tostring()) - for i=1,11 do - print(i+1) - next = next:to_the_left_on_circle_of_5ths(1) - -- print(next:tostring()) - end - luaunit.assertEquals(next, Scale.c_major()) -end - -function TestCircleOf5ths:test_totheright() - local c_major = Scale.c_major() - local next = c_major:to_the_right_on_circle_of_5ths(1) - -- print(next:tostring()) - for i=1,11 do - print(i+1) - next = next:to_the_right_on_circle_of_5ths(1) - -- print(next:tostring()) - end - luaunit.assertEquals(next, Scale.c_major()) -end diff --git a/test/test_scale.lua b/test/test_scale.lua index 3a2e9c6..9f2ee41 100644 --- a/test/test_scale.lua +++ b/test/test_scale.lua @@ -359,4 +359,26 @@ function TestScale:testGetDistance() luaunit.assertEquals(f_sharp_maj:get_distance(g_flat_min), 2) luaunit.assertEquals(f_sharp_maj:get_distance(d_sharp_min), 0) luaunit.assertEquals(f_sharp_maj:get_distance(d_sharp_min_harm), 1) -end \ No newline at end of file +end + +function TestScale:test_c5ths_totheleft() + local c_major = Scale.c_major() + local next = c_major:to_the_left_on_circle_of_5ths(1) + -- print(next:tostring()) + for i=1,11 do + next = next:to_the_left_on_circle_of_5ths(1) + -- print(next:tostring()) + end + luaunit.assertEquals(next, Scale.c_major()) +end + +function TestScale:test_c5ths_totheright() + local c_major = Scale.c_major() + local next = c_major:to_the_right_on_circle_of_5ths(1) + -- print(next:tostring()) + for i=1,11 do + next = next:to_the_right_on_circle_of_5ths(1) + -- print(next:tostring()) + end + luaunit.assertEquals(next, Scale.c_major()) +end