diff --git a/src/SoundMaker/ScoreData/SMSC/Parser.cs b/src/SoundMaker/ScoreData/SMSC/Parser.cs index afbfcba..dfa5b65 100644 --- a/src/SoundMaker/ScoreData/SMSC/Parser.cs +++ b/src/SoundMaker/ScoreData/SMSC/Parser.cs @@ -248,15 +248,8 @@ private ParseResult ParseTuplet() { // 'rest'のトークンを破棄 _ = _tokens.Dequeue(); - var isDottedRest = false; - // '.'の場合は付点休符とする - if (_tokens.TryPeek(out var dotToken) && dotToken.Type is TokenType.Dot) - { - _ = _tokens.Dequeue(); - isDottedRest = true; - } // 連符なので長さは適当に入れる - var rest = new Rest(LengthType.Whole, isDottedRest); + var rest = new Rest(LengthType.Whole, false); components.Add(rest); } // 上記以外は音符として解析するが、連符専用の書き方なのでここで実装する。 @@ -268,15 +261,8 @@ private ParseResult ParseTuplet() { return new(null, scaleResult.Error); } - var isDottedNote = false; - // '.'の場合は付点音符とする - if (_tokens.TryPeek(out var dotToken) && dotToken.Type is TokenType.Dot) - { - _ = _tokens.Dequeue(); - isDottedNote = true; - } // 連符なので長さは適当に入れる - var note = new Note(scale.Scale, scale.ScaleNumber, LengthType.Whole, isDottedNote); + var note = new Note(scale.Scale, scale.ScaleNumber, LengthType.Whole, false); components.Add(note); } } diff --git a/src/SoundMaker/ScoreData/SMSC/SMSC.bnf b/src/SoundMaker/ScoreData/SMSC/SMSC.bnf index 33142aa..cb432d1 100644 --- a/src/SoundMaker/ScoreData/SMSC/SMSC.bnf +++ b/src/SoundMaker/ScoreData/SMSC/SMSC.bnf @@ -23,7 +23,7 @@ rest ::= 'rest' ',' tie ::= 'tie' '(' ',' |'rest' {',' |'rest'}* ')' # 連符の表記方法 - Tuplet notation -tuplet ::= 'tup' '(' ',' { '.'?}|{'rest' '.'?}| {',' { '.'?}|{'rest' '.'?}|}* ')' +tuplet ::= 'tup' '(' ',' |'rest'| {',' |'rest'|}* ')' # 文末 - End of statement endOfStatement ::= ';'|\n|\r|\r\n diff --git a/src/SoundMaker/ScoreData/SMSC/SMSCSerializer.cs b/src/SoundMaker/ScoreData/SMSC/SMSCSerializer.cs index e5d177d..4492671 100644 --- a/src/SoundMaker/ScoreData/SMSC/SMSCSerializer.cs +++ b/src/SoundMaker/ScoreData/SMSC/SMSCSerializer.cs @@ -17,7 +17,7 @@ public static string Serialize(IEnumerable components) Tuplet tuplet => SerializeTuplet(tuplet), _ => "", }; - _ = smscBuilder.AppendLine(line); + _ = smscBuilder.Append(line).Append('\n'); } return smscBuilder.ToString(); } diff --git a/test/UnitTests/ScoreData/SMSC/ParserTest.cs b/test/UnitTests/ScoreData/SMSC/ParserTest.cs index 9608c3b..2a986e1 100644 --- a/test/UnitTests/ScoreData/SMSC/ParserTest.cs +++ b/test/UnitTests/ScoreData/SMSC/ParserTest.cs @@ -155,7 +155,7 @@ public void TestParse_Tie() [Fact(DisplayName = "連符を解析できるか")] public void TestParse_Tuplet() { - var data = "tup(16, C#4, rest, E4.)"; + var data = "tup(16, C#4, rest, E4)"; var lexer = new Lexer(data); var tokens = lexer.ReadAll(); var parser = new Parser(tokens); @@ -263,7 +263,7 @@ public void Test_NotFoundCommaErrors(string data, int expectedCount) } [Theory(DisplayName = ")が見つからないエラーのテスト")] - [InlineData("tie(C4,1;tup(4.,C4.", 2)] + [InlineData("tie(C4,1;tup(4,C4", 2)] public void Test_NotFoundRightParenthesesErrors(string data, int expectedCount) { var lexer = new Lexer(data); @@ -274,7 +274,7 @@ public void Test_NotFoundRightParenthesesErrors(string data, int expectedCount) } [Theory(DisplayName = "(が見つからないエラーのテスト")] - [InlineData("tie)C4,1;tup4.,C4.", 2)] + [InlineData("tie)C4,1;tup.4,C4", 2)] public void Test_NotFoundLeftParenthesesErrors(string data, int expectedCount) { var lexer = new Lexer(data); diff --git a/test/UnitTests/ScoreData/SMSC/SMSCSerializerTest.cs b/test/UnitTests/ScoreData/SMSC/SMSCSerializerTest.cs index 63b6907..10a3ef4 100644 --- a/test/UnitTests/ScoreData/SMSC/SMSCSerializerTest.cs +++ b/test/UnitTests/ScoreData/SMSC/SMSCSerializerTest.cs @@ -8,11 +8,11 @@ public class SMSCSerializerTest public void TestSerialize() { var note = new Note(Scale.C, 4, LengthType.Whole, true); - + var tupletNote = new Note(Scale.C, 4, LengthType.Whole); var expected = @"C4,1. rest,4 tie(C4,1.,1.,1.) -tup(2,C4.,C4.,C4.) +tup(2,C4,C4,C4) "; var components = new List() @@ -23,7 +23,7 @@ public void TestSerialize() { note, note }), - new Tuplet(new List() {note, note, note}, LengthType.Half, false) + new Tuplet(new List() { tupletNote, tupletNote, tupletNote}, LengthType.Half, false) }; var actual = SMSCSerializer.Serialize(components);