From c92f7db4280f9ff17ad7df0c84175fc84ddaeb94 Mon Sep 17 00:00:00 2001 From: y4my4my4m <8145020+y4my4my4m@users.noreply.github.com> Date: Mon, 4 Sep 2023 21:15:09 +0900 Subject: [PATCH] oscilloscope --- src/Home/Tracker/Load.ZC | 5 ++- src/Home/Tracker/MusicTracker.ZC | 38 +++++++++++------ src/Home/Tracker/Oscilloscope.ZC | 73 ++++++++++++++++++++++++++++++++ src/Home/Tracker/Utils.ZC | 9 ++++ src/Home/Tracker/WaveformGen.ZC | 9 ---- 5 files changed, 112 insertions(+), 22 deletions(-) create mode 100755 src/Home/Tracker/Oscilloscope.ZC create mode 100755 src/Home/Tracker/Utils.ZC diff --git a/src/Home/Tracker/Load.ZC b/src/Home/Tracker/Load.ZC index 6990296f..d875fb6c 100755 --- a/src/Home/Tracker/Load.ZC +++ b/src/Home/Tracker/Load.ZC @@ -21,12 +21,15 @@ U16 currentRate = InU16(ac97.nam + EXT_FRONT_RATE); "currentRate: %d\n", currentRate; #include "Classes" +#include "Utils" // include_noreindex "MIDIHandling" // include_noreindex "WaveformGen" // include_noreindex "UITracker" +#include "Oscilloscope" #include "MusicTracker" AutoComplete(0); -MusicTracker; \ No newline at end of file +MusicTracker; +StartOscilloscope; \ No newline at end of file diff --git a/src/Home/Tracker/MusicTracker.ZC b/src/Home/Tracker/MusicTracker.ZC index c23b36ce..c555f301 100755 --- a/src/Home/Tracker/MusicTracker.ZC +++ b/src/Home/Tracker/MusicTracker.ZC @@ -42,7 +42,7 @@ U0 AudioPlayNote(U8 note, U8 velocity, U8 instrument) { break; case SAMPLE: PlaySample(buffer, bufferSize, note, velocity); - Print("Buffer first values: %d, %d, %d, %d...\n", buffer[0], buffer[1], buffer[2], buffer[3]); + //Print("Buffer first values: %d, %d, %d, %d...\n", buffer[0], buffer[1], buffer[2], buffer[3]); break; default: GenerateSineWave(buffer, bufferSize, freq, velocity); @@ -51,35 +51,49 @@ U0 AudioPlayNote(U8 note, U8 velocity, U8 instrument) { //ApplyEnvelope(buffer, SAMPLE_RATE); // TODO: Apply fade in and fade out + // I64 i; + // for (i = 0; i < bufferSize; i++) { + // // Copy data to the shared oscilloscope buffer + // gSharedBuffer[i] = buffer[i]; + // } + // Play the buffer using the AC97 driver: AudioSFXPlay(buffer, bufferSize); // silly debug print - if (instrument == SAMPLE) - "Instrument: $$RED$$ SAMPLE $$DKGRAY$$|$$FG$$ Note: $$YELLOW$$%d$$FG$$\n", note; if (instrument == PULSE1) - "Instrument: $$GREEN$$ PULSE1 $$DKGRAY$$|$$FG$$ Note: $$YELLOW$$%d$$FG$$\n", note; + "³ $$GREEN$$PULSE1 $$FG$$³ $$YELLOW$$%d$$FG$$\t³", note; if (instrument == PULSE2) - "Instrument: $$CYAN$$ PULSE2 $$DKGRAY$$|$$FG$$ Note: $$YELLOW$$%d$$FG$$\n", note; + "³ $$CYAN$$PULSE2 $$FG$$³ $$YELLOW$$%d$$FG$$\t³", note; if (instrument == TRIANGLE) - "Instrument: $$YELLOW$$ TRIANGLE $$DKGRAY$$|$$FG$$ Note: $$YELLOW$$%d$$FG$$\n", note; + "³ $$YELLOW$$TRIANGLE $$FG$$³ $$YELLOW$$%d$$FG$$\t³", note; if (instrument == NOISE) - "Instrument: $$BROWN$$ NOISE $$DKGRAY$$|$$FG$$ Note: $$YELLOW$$%d$$FG$$\n", note; - + "³ $$BROWN$$NOISE $$FG$$³ $$YELLOW$$%d$$FG$$\t³", note; + if (instrument == SAMPLE) + "³ $$RED$$SAMPLE $$FG$$³ $$YELLOW$$%d$$FG$$\t³", note; + if (instrument == INSTRUMENT_NONE) + "³ ³ \t³", note; + + "\n"; Free(buffer); } U0 PlayPattern(Pattern *pattern) { I64 row; NoteCell *cell; + "ÚÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄ¿\n"; + "³ INSTRUMENT ³ NOTE ³\n"; + "ÃÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄ´\n"; for (row = 0; row < TRACK_LENGTH; row++) { cell = &pattern->cells[row]; if (cell->note) { AudioPlayNote(cell->note, cell->velocity, cell->instrument); + if (row < TRACK_LENGTH-1) "ÃÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄ´\n"; } if (cell->instrument == SAMPLE) Sleep(1000); // wait for 6sec for the 7sec sample test //Sleep(1200); // Adjust for tempo Sleep(300); } + "ÀÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÙ\n"; } U0 EnterPattern(Pattern *pattern) { @@ -87,7 +101,7 @@ U0 EnterPattern(Pattern *pattern) { NoteCell *cell; for (row = 0; row < TRACK_LENGTH; row++) { cell = &pattern->cells[row]; - Print("Enter note for row %d (0-127, 0 for none): ", row); + Print("Enter note for row $$LTGREEN$$%d$$FG$$ (0-127, 0 for none): ", row); cell->note = KeyGet(&sc); "%d\n", cell->note; if (cell->note) { @@ -118,11 +132,10 @@ U0 EnterPattern(Pattern *pattern) { "SAMPLE\n"; break; default: - Print("Invalid choice.\n"); cell->instrument = INSTRUMENT_NONE; - "SINE\n"; + "SINE\n"; break; - // return; + // return; } AudioPlayNote(cell->note, cell->velocity, cell->instrument); @@ -216,4 +229,5 @@ U0 MusicTracker() { } } CleanupWaveformGen(); // Free the sample buffer + Kill("Oscilloscope"); } diff --git a/src/Home/Tracker/Oscilloscope.ZC b/src/Home/Tracker/Oscilloscope.ZC new file mode 100755 index 00000000..80a5e4fb --- /dev/null +++ b/src/Home/Tracker/Oscilloscope.ZC @@ -0,0 +1,73 @@ +// Globals +U32 *gSharedBuffer; +I64 gSharedBufferPosition = 0; +I64 gSharedBufferSize; + +// Initialize shared buffer +U0 InitSharedBuffer(I64 size) { + gSharedBuffer = MAlloc(size * sizeof(U32)); + gSharedBufferSize = size; + gSharedBufferPosition = 0; +} + +// Update shared buffer in your audio playback function +U0 UpdateSharedBuffer(U32 *buffer, I64 size) { + I64 i; + for (i = 0; i < size; i++) { + gSharedBuffer[gSharedBufferPosition] = buffer[i]; + gSharedBufferPosition = (gSharedBufferPosition + 1) % gSharedBufferSize; + } +} +U0 OscilloscopeDraw() { + I64 i, y; + //GrClear(0); // Clear the screen + + I64 startPosition = gSharedBufferPosition; + for (i = 0; i < 400; i++) { + I16 sample_value = (gSharedBuffer[startPosition] & 0xFFFF) - 32768; // extract left channel and center around 0 + F64 normalized_sample = ToF64(sample_value) / 32768.0; + y = 300 / 2 - (normalized_sample * 300 / 2); + + GrPlot(i, y, WHITE); // Using GrPlot instead of DrawPoint + + startPosition = (startPosition + 1) % gSharedBufferSize; + } +} + +// Oscilloscope task +U0 OscilloscopeTask() { + // Fs->draw_it = &OscilloscopeDraw; // Set the draw callback + + while (TRUE) + { + Refresh; + } + +} + +U0 StartOscilloscope() { + InitSharedBuffer(44100); // For example, buffer to store 1 second of audio at 44100Hz + + // SettingsPush(); // Push current settings + // Fs->win_width = 400; // Width of the oscilloscope window + // Fs->win_height = 300; // Height of the oscilloscope window + WinHorz((TEXT_COLS / 2) - 200, + (TEXT_COLS / 2) - 200 + (200 - 1), + Fs); + WinVert((TEXT_ROWS / 2) - 150, + (TEXT_ROWS / 2) - 150 + (Fs->win_height - 1), + Fs); + // Fs->border_src = BDS_CONST; + // Fs->border_attr = LTGREEN << 4 + WHITE; + // StrCopy(Fs->task_title, "Oscilloscope"); + + Fs->draw_it = &OscilloscopeDraw; // Set the draw callback + + while (TRUE) + { + Refresh; + } + // Spawn("Oscilloscope", OscilloscopeTask); // Start the oscilloscope task + + // SettingsPop(); // Pop settings +} diff --git a/src/Home/Tracker/Utils.ZC b/src/Home/Tracker/Utils.ZC new file mode 100755 index 00000000..f961ecb6 --- /dev/null +++ b/src/Home/Tracker/Utils.ZC @@ -0,0 +1,9 @@ +F64 RoundToNearestHalf(F64 value) { + return Round(value * 2.0) / 2.0; +} + +F64 GetPlaybackRateMultiplier(U8 targetNote, U8 referenceNote) { + I64 semitoneDifference = targetNote - referenceNote; + return Pow(2.0, semitoneDifference / 12.0); +} + \ No newline at end of file diff --git a/src/Home/Tracker/WaveformGen.ZC b/src/Home/Tracker/WaveformGen.ZC index fbd75e66..0c831554 100755 --- a/src/Home/Tracker/WaveformGen.ZC +++ b/src/Home/Tracker/WaveformGen.ZC @@ -223,15 +223,6 @@ U0 LoadSample(U8 *filename) { // return ClampToI16(RoundF64(result)); // } -F64 RoundToNearestHalf(F64 value) { - return Round(value * 2.0) / 2.0; -} - -F64 GetPlaybackRateMultiplier(U8 targetNote, U8 referenceNote) { - I64 semitoneDifference = targetNote - referenceNote; - return Pow(2.0, semitoneDifference / 12.0); -} - U0 PlaySample(U32 *buffer, I64 duration, U8 note, U8 velocity) { if (!gSampleData || !gSampleSize) { Print("Sample not loaded.\n");