Skip to content

Commit ef79982

Browse files
Fixes for inefficient invalid octave fixer and synchronized play
- The inefficient invalid octave fixer in output processor of the "Create Music with AI" is fixed to situations of uncaught invalid notes such as A#Whole - Synchronized play now have an error provider to show error when music is already playing or line is empty - The time issue that causes to music is not playing in time or playing early issue is fixed.
1 parent 8cd1774 commit ef79982

16 files changed

Lines changed: 896 additions & 766 deletions

NeoBleeper/CreateMusicWithAI.cs

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2530,6 +2530,22 @@ private string NormalizeNoteValues(string nbpmlContent)
25302530
if (string.IsNullOrWhiteSpace(nbpmlContent))
25312531
return string.Empty;
25322532

2533+
// Convert notes with duration to standard format (e.g., C Whole -> C4)
2534+
nbpmlContent = Regex.Replace(
2535+
nbpmlContent,
2536+
@"<Note([1-4])>\s*([A-G])\s*([#♯b♭]?)\s*(Whole|Half|Quarter|1/8|1/16|1/32)\s*</Note\1>",
2537+
m =>
2538+
{
2539+
var idx = m.Groups[1].Value;
2540+
var letter = m.Groups[2].Value.ToUpperInvariant();
2541+
var accidental = m.Groups[3].Value; // may be "" or one of #, ♯, b, ♭
2542+
// Normalize unicode flats/sharps to ASCII where later code expects '#'
2543+
if (accidental == "♯") accidental = "#";
2544+
if (accidental == "♭") accidental = "b";
2545+
return $"<Note{idx}>{letter}{accidental}4</Note{idx}>";
2546+
},
2547+
RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
2548+
25332549
// Convert solfege to letter notes
25342550
var solfegeMap = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
25352551
{
@@ -2541,23 +2557,23 @@ private string NormalizeNoteValues(string nbpmlContent)
25412557
};
25422558

25432559
foreach (var pair in solfegeMap)
2544-
{
2545-
nbpmlContent = Regex.Replace(
2546-
nbpmlContent,
2547-
$@"<Note([1-4])>\s*{Regex.Escape(pair.Key)}([#b♯♭]?)(\d*)\s*</Note\1>",
2548-
m =>
2549-
{
2550-
var noteLetter = pair.Value;
2551-
var accidental = m.Groups[2].Value; // #, b, ♯, ♭ veya boş
2552-
var octave = m.Groups[3].Value; // Oktav numarası veya boş
2553-
// Oktav yoksa 4 ekle
2554-
if (string.IsNullOrEmpty(octave))
2555-
octave = "4";
2556-
return $"<Note{m.Groups[1].Value}>{noteLetter}{accidental}{octave}</Note{m.Groups[1].Value}>";
2557-
},
2558-
RegexOptions.IgnoreCase
2559-
);
2560-
}
2560+
{
2561+
nbpmlContent = Regex.Replace(
2562+
nbpmlContent,
2563+
$@"<Note([1-4])>\s*{Regex.Escape(pair.Key)}([#b♯♭]?)(\d*)\s*</Note\1>",
2564+
m =>
2565+
{
2566+
var noteLetter = pair.Value;
2567+
var accidental = m.Groups[2].Value; // #, b, ♯, ♭ or empty
2568+
var octave = m.Groups[3].Value; // Octave number or empty
2569+
// Add default octave 4 if missing
2570+
if (string.IsNullOrEmpty(octave))
2571+
octave = "4";
2572+
return $"<Note{m.Groups[1].Value}>{noteLetter}{accidental}{octave}</Note{m.Groups[1].Value}>";
2573+
},
2574+
RegexOptions.IgnoreCase
2575+
);
2576+
}
25612577

25622578
// Fix notes with ambigious octaves (e.g., C, D#, A, Gb without octave)
25632579
nbpmlContent = Regex.Replace(

NeoBleeper/NeoBleeper.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<AssemblyVersion></AssemblyVersion>
1515
<Company>GeniusPilot2016</Company>
1616
<Authors>GeniusPilot2016</Authors>
17-
<Version>1.4.0-beta</Version>
17+
<Version>1.4.1-beta</Version>
1818
<PlatformTarget>AnyCPU</PlatformTarget>
1919
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
2020
<Platforms>x64;ARM64</Platforms>

NeoBleeper/Properties/Resources.Designer.cs

Lines changed: 18 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

NeoBleeper/Properties/Resources.de.resx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,4 +1094,13 @@ Um diese Funktion zu nutzen, aktivieren Sie bitte das Kontrollkästchen „MIDI-
10941094
<data name="TitleNoNotesGenerated" xml:space="preserve">
10951095
<value>Es wurden keine Noten generiert</value>
10961096
</data>
1097+
<data name="AISettingsAgeRestrictionWarning" xml:space="preserve">
1098+
<value>Um diese Funktion nutzen zu können, müssen Sie mindestens 18 Jahre alt sein.</value>
1099+
</data>
1100+
<data name="ErrorLineIsEmpty" xml:space="preserve">
1101+
<value>Die Zeilenliste ist leer. Bitte fügen Sie vor dem Abspielen Noten hinzu.</value>
1102+
</data>
1103+
<data name="ErrorMusicIsAlreadyPlaying" xml:space="preserve">
1104+
<value>Die Musik wird bereits abgespielt. Bitte stoppen Sie die Wiedergabe, bevor Sie mit dem Warten beginnen.</value>
1105+
</data>
10971106
</root>

NeoBleeper/Properties/Resources.es.resx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,4 +1094,13 @@ Para usar esta función, marque la casilla "Usar salida MIDI" en la pestaña "Di
10941094
<data name="TitleNoNotesGenerated" xml:space="preserve">
10951095
<value>No se generaron notas</value>
10961096
</data>
1097+
<data name="AISettingsAgeRestrictionWarning" xml:space="preserve">
1098+
<value>Para utilizar esta función debes tener al menos 18 años.</value>
1099+
</data>
1100+
<data name="ErrorLineIsEmpty" xml:space="preserve">
1101+
<value>La lista de líneas está vacía. Añada notas antes de iniciar la reproducción.</value>
1102+
</data>
1103+
<data name="ErrorMusicIsAlreadyPlaying" xml:space="preserve">
1104+
<value>La música ya está sonando. Por favor, detén la reproducción antes de empezar a esperar.</value>
1105+
</data>
10971106
</root>

NeoBleeper/Properties/Resources.fr.resx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,4 +1094,13 @@ Pour utiliser cette fonctionnalité, cochez la case « Utiliser la sortie MIDI
10941094
<data name="TitleNoNotesGenerated" xml:space="preserve">
10951095
<value>Aucune note générée</value>
10961096
</data>
1097+
<data name="AISettingsAgeRestrictionWarning" xml:space="preserve">
1098+
<value>Vous devez avoir au moins 18 ans pour utiliser cette fonctionnalité.</value>
1099+
</data>
1100+
<data name="ErrorLineIsEmpty" xml:space="preserve">
1101+
<value>La liste des lignes est vide. Veuillez ajouter des notes avant de commencer la lecture.</value>
1102+
</data>
1103+
<data name="ErrorMusicIsAlreadyPlaying" xml:space="preserve">
1104+
<value>La musique est déjà en cours de lecture. Veuillez l'arrêter avant de commencer à attendre.</value>
1105+
</data>
10971106
</root>

NeoBleeper/Properties/Resources.it.resx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,4 +1093,13 @@ Spunta la casella di controllo "Usa uscita MIDI" nella scheda "Dispositivi" nell
10931093
<data name="TitleNoNotesGenerated" xml:space="preserve">
10941094
<value>Nessuna nota generata</value>
10951095
</data>
1096+
<data name="AISettingsAgeRestrictionWarning" xml:space="preserve">
1097+
<value>Per utilizzare questa funzione devi avere almeno 18 anni.</value>
1098+
</data>
1099+
<data name="ErrorLineIsEmpty" xml:space="preserve">
1100+
<value>L'elenco delle righe è vuoto. Aggiungi delle note prima di iniziare la riproduzione.</value>
1101+
</data>
1102+
<data name="ErrorMusicIsAlreadyPlaying" xml:space="preserve">
1103+
<value>La musica è già in riproduzione. Interrompere la riproduzione prima di iniziare l'attesa.</value>
1104+
</data>
10961105
</root>

NeoBleeper/Properties/Resources.resx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,4 +1123,13 @@ Please check "Use MIDI output" checkbox from "Devices" tab in settings or unchec
11231123
<data name="TitleNoNotesGenerated" xml:space="preserve">
11241124
<value>No Notes Generated</value>
11251125
</data>
1126+
<data name="AISettingsAgeRestrictionWarning" xml:space="preserve">
1127+
<value>You must be at least 18 years old to use this feature.</value>
1128+
</data>
1129+
<data name="ErrorLineIsEmpty" xml:space="preserve">
1130+
<value>The line list is empty. Please add notes before starting playback.</value>
1131+
</data>
1132+
<data name="ErrorMusicIsAlreadyPlaying" xml:space="preserve">
1133+
<value>The music is already playing. Please stop playback before starting waiting.</value>
1134+
</data>
11261135
</root>

NeoBleeper/Properties/Resources.ru.resx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,4 +1096,13 @@
10961096
<data name="TitleNoNotesGenerated" xml:space="preserve">
10971097
<value>Ноты не сгенерированы</value>
10981098
</data>
1099+
<data name="AISettingsAgeRestrictionWarning" xml:space="preserve">
1100+
<value>Для использования этой функции вам должно быть не менее 18 лет.</value>
1101+
</data>
1102+
<data name="ErrorLineIsEmpty" xml:space="preserve">
1103+
<value>Список строк пуст. Пожалуйста, добавьте примечания перед началом воспроизведения.</value>
1104+
</data>
1105+
<data name="ErrorMusicIsAlreadyPlaying" xml:space="preserve">
1106+
<value>Музыка уже играет. Пожалуйста, остановите воспроизведение, прежде чем начать ждать.</value>
1107+
</data>
10991108
</root>

NeoBleeper/Properties/Resources.tr.resx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,4 +1095,13 @@ Bu özelliği kullanmak için lütfen ayarlardaki "Cihazlar" sekmesinden "MIDI
10951095
<data name="TitleNoNotesGenerated" xml:space="preserve">
10961096
<value>Nota oluşturulmadı</value>
10971097
</data>
1098+
<data name="AISettingsAgeRestrictionWarning" xml:space="preserve">
1099+
<value>Bu özelliği kullanabilmek için en az 18 yaşında olmanız gerekmektedir.</value>
1100+
</data>
1101+
<data name="ErrorLineIsEmpty" xml:space="preserve">
1102+
<value>Satır listesi boş. Lütfen oynatmaya başlamadan önce nota ekleyiniz.</value>
1103+
</data>
1104+
<data name="ErrorMusicIsAlreadyPlaying" xml:space="preserve">
1105+
<value>Müzik zaten oynatılıyor. Beklemeye başlamadan önce lütfen oynatmayı durdurunuz.</value>
1106+
</data>
10981107
</root>

0 commit comments

Comments
 (0)