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 diff --git a/run_utests.lua b/run_utests.lua index 216cd66..3de019d 100644 --- a/run_utests.lua +++ b/run_utests.lua @@ -13,4 +13,4 @@ require('test/tracks/test_clip_array') require('test/tracks/test_event') require('test/tracks/test_event_array') -os.exit( lu.LuaUnit.run() ) \ No newline at end of file +os.exit( lu.LuaUnit.run() ) 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: 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