namespace SAAN_FRESH___RAW_NON_APIS_WAVES_TO_SHRUTIES_COPIER_GPTS
{
public class SAANS_NO_3RD_PARTY_GPT_STYLES_WAV_FILES_READER_TO_GENERATE_8000_HZ_16_BIT_PCMS_GTAMPS
{
//////public static void Write_SPLITTED_WavFile(string path, List<float> normalizedSamples, int sampleRate)
//////{
////// short bitsPerSample = 16;
////// short channels = 1;
////// int byteRate = sampleRate * channels * bitsPerSample / 8;
////// int dataSize = normalizedSamples.Count * 2;
////// using (var writer = new BinaryWriter(File.Create(path)))
////// {
////// writer.Write(Encoding.ASCII.GetBytes("RIFF"));
////// writer.Write(36 + dataSize);
////// writer.Write(Encoding.ASCII.GetBytes("WAVE"));
////// writer.Write(Encoding.ASCII.GetBytes("fmt "));
////// writer.Write(16);
////// writer.Write((short)1); // PCM
////// writer.Write((short)channels);
////// writer.Write(sampleRate);
////// writer.Write(byteRate);
////// writer.Write((short)(channels * bitsPerSample / 8));
////// writer.Write(bitsPerSample);
////// writer.Write(Encoding.ASCII.GetBytes("data"));
////// writer.Write(dataSize);
////// foreach (float sample in normalizedSamples)
////// writer.Write((short)(sample * 32767));
////// }//using (var writer = new BinaryWriter(File.Create(path)))
//////}//public static void Write_SPLITTED_WavFile(string path, List<float> normalizedSamples, int sampleRate)
public static void SplitWavByAmplitudePercentilewith_dynamik_thresholds(string wavPath)
{
string fileNameOnly = Path.GetFileNameWithoutExtension(wavPath);
string folder = Path.GetDirectoryName(wavPath);
short channels = 1;
int sampleRate = 8000;
short bitsPerSample = 16;
List<float> amplitudes = new List<float>();
// ---- Read WAV and extract normalized amplitudes ----
using (var reader = new BinaryReader(File.OpenRead(wavPath)))
{
if (new string(reader.ReadChars(4)) != "RIFF") throw new Exception("Invalid RIFF");
reader.ReadInt32(); // size
if (new string(reader.ReadChars(4)) != "WAVE") throw new Exception("Invalid WAVE");
while (reader.BaseStream.Position < reader.BaseStream.Length)
{
string chunkId = new string(reader.ReadChars(4));
int chunkSize = reader.ReadInt32();
if (chunkId == "fmt ")
{
reader.ReadInt16(); // audioFormat
channels = reader.ReadInt16();
sampleRate = reader.ReadInt32();
reader.ReadInt32(); // byteRate
reader.ReadInt16(); // blockAlign
bitsPerSample = reader.ReadInt16();
if (chunkSize > 16) reader.ReadBytes(chunkSize - 16);
}
else if (chunkId == "data")
{
int bytesPerSample = bitsPerSample / 8;
int totalSamples = chunkSize / bytesPerSample;
for (int i = 0; i < totalSamples; i++)
{
if (reader.BaseStream.Position + bytesPerSample > reader.BaseStream.Length)
break;
short sample = reader.ReadInt16();
float norm = sample / 32768f;
amplitudes.Add(norm);
if (channels == 2) reader.ReadInt16(); // skip right channel
}
break;
}
else reader.ReadBytes(chunkSize); // skip unknown
}
}
// ---- Calculate 20th percentile of absolute amplitudes ----
var absSorted = amplitudes.Select(Math.Abs).OrderBy(v => v).ToList();
float percentile20 = absSorted[(int)(absSorted.Count * 0.2)];
Console.WriteLine($"Using 20th Percentile Amplitude as Threshold: {percentile20:F6}");
// ---- Detect rising/falling threshold crossings ----
List<(int Start, int End)> regions = new List<(int, int)>();
bool inRegion = false;
int regionStart = 0;
int minSegmentSamples = 800; // ~100 ms
for (int i = 0; i < amplitudes.Count; i++)
{
float absAmp = Math.Abs(amplitudes[i]);
if (!inRegion && absAmp >= percentile20)
{
inRegion = true;
regionStart = i;
}
else if (inRegion && absAmp < percentile20)
{
int regionEnd = i;
if (regionEnd - regionStart >= minSegmentSamples)
regions.Add((regionStart, regionEnd));
inRegion = false;
}
}
// Handle edge case if region reaches file end
if (inRegion && amplitudes.Count - regionStart >= minSegmentSamples)
regions.Add((regionStart, amplitudes.Count - 1));
// ---- Save split WAVs ----
for (int i = 0; i < regions.Count; i++)
{
int start = regions[i].Start;
int end = regions[i].End;
var segment = amplitudes.GetRange(start, end - start);
string outputFile = Path.Combine(folder,
$"{fileNameOnly}_piece_{i + 1}_samples_{segment.Count}_ms_{(int)(segment.Count / (float)sampleRate * 1000)}.wav");
Write_SPLITTED_WavFile(outputFile, segment, sampleRate);
Console.WriteLine($"Saved: {outputFile}");
}
if (regions.Count == 0)
Console.WriteLine("No regions above the 20th percentile threshold were long enough to save.");
}//public static void SplitWavByAmplitudePercentilewith_dynamik_thresholds(string wavPath)
public static void SplitWavByRisingAbove20dBRegions(string wavPath)
{
string fileNameOnly = Path.GetFileNameWithoutExtension(wavPath);
string folder = Path.GetDirectoryName(wavPath);
short channels = 1;
int sampleRate = 8000;
short bitsPerSample = 16;
List<float> amplitudes = new List<float>();
// ---- Read WAV and extract normalized amplitudes ----
using (var reader = new BinaryReader(File.OpenRead(wavPath)))
{
// Read RIFF/WAVE
if (new string(reader.ReadChars(4)) != "RIFF") throw new Exception("Invalid RIFF");
reader.ReadInt32(); // size
if (new string(reader.ReadChars(4)) != "WAVE") throw new Exception("Invalid WAVE");
while (reader.BaseStream.Position < reader.BaseStream.Length)
{
string chunkId = new string(reader.ReadChars(4));
int chunkSize = reader.ReadInt32();
if (chunkId == "fmt ")
{
reader.ReadInt16(); // audioFormat
channels = reader.ReadInt16();
sampleRate = reader.ReadInt32();
reader.ReadInt32(); // byteRate
reader.ReadInt16(); // blockAlign
bitsPerSample = reader.ReadInt16();
if (chunkSize > 16) reader.ReadBytes(chunkSize - 16);
}
else if (chunkId == "data")
{
int bytesPerSample = bitsPerSample / 8;
int totalSamples = chunkSize / bytesPerSample;
for (int i = 0; i < totalSamples; i++)
{
if (reader.BaseStream.Position + bytesPerSample > reader.BaseStream.Length)
break;
short sample = reader.ReadInt16();
float norm = sample / 32768f;
amplitudes.Add(norm);
if (channels == 2) reader.ReadInt16(); // skip right
}
break;
}
else reader.ReadBytes(chunkSize);
}
}
// ---- SPLITTING BASED ON AMPLITUDE THRESHOLD ----
float threshold = 0.1f; // ~ -20 dB
bool inRegion = false;
int regionStart = 0;
int minSegmentSamples = 800; // = 100ms worth (8000Hz)
List<(int Start, int End)> regions = new List<(int, int)>();
for (int i = 0; i < amplitudes.Count; i++)
{
float absAmp = Math.Abs(amplitudes[i]);
if (!inRegion && absAmp >= threshold)
{
inRegion = true;
regionStart = i;
}
else if (inRegion && absAmp < threshold)
{
// End of region
int regionEnd = i;
if (regionEnd - regionStart >= minSegmentSamples)
regions.Add((regionStart, regionEnd));
inRegion = false;
}
}//for (int i = 0; i < amplitudes.Count; i++)
// Edge case: still in region at end
if (inRegion && amplitudes.Count - regionStart >= minSegmentSamples)
regions.Add((regionStart, amplitudes.Count - 1));
// ---- SAVE SPLIT WAVS ----
for (int i = 0; i < regions.Count; i++)
{
int start = regions[i].Start;
int end = regions[i].End;
var segment = amplitudes.GetRange(start, end - start);
string outputFile = Path.Combine(folder,
$"{fileNameOnly}_piece_{i + 1}_samples_{segment.Count}_ms_{(int)(segment.Count / (float)sampleRate * 1000)}.wav");
Write_SPLITTED_WavFile(outputFile, segment, sampleRate);
Console.WriteLine($"Saved: {outputFile}");
}//for (int i = 0; i < regions.Count; i++)
}//public static void SplitWavByRisingAbove20dBRegions(string wavPath)
public static void DISCARDING___THIS_GENERATES_LARGE_NUMBER_OF_SPLITTED_FILES______SplitWavByLocalMinimals_Of_Amplitudes(string wavPath)
{
string fileNameOnly = Path.GetFileNameWithoutExtension(wavPath);
string folder = Path.GetDirectoryName(wavPath);
short channels = 1;
int sampleRate = 8000;
short bitsPerSample = 16;
List<float> amplitudes = new List<float>();
// ---- Read WAV and extract normalized amplitudes ----
using (var reader = new BinaryReader(File.OpenRead(wavPath)))
{
// Validate RIFF and WAVE
if (new string(reader.ReadChars(4)) != "RIFF") throw new Exception("Invalid RIFF");
reader.ReadInt32(); // size
if (new string(reader.ReadChars(4)) != "WAVE") throw new Exception("Invalid WAVE");
while (reader.BaseStream.Position < reader.BaseStream.Length)
{
string chunkId = new string(reader.ReadChars(4));
int chunkSize = reader.ReadInt32();
if (chunkId == "fmt ")
{
reader.ReadInt16(); // audioFormat
channels = reader.ReadInt16();
sampleRate = reader.ReadInt32();
reader.ReadInt32(); // byteRate
reader.ReadInt16(); // blockAlign
bitsPerSample = reader.ReadInt16();
if (chunkSize > 16) reader.ReadBytes(chunkSize - 16);
}
else if (chunkId == "data")
{
int bytesPerSample = bitsPerSample / 8;
int totalSamples = chunkSize / bytesPerSample;
for (int i = 0; i < totalSamples; i++)
{
if (reader.BaseStream.Position + bytesPerSample > reader.BaseStream.Length)
break;
short sample = reader.ReadInt16();
float norm = sample / 32768f;
amplitudes.Add(norm);
if (channels == 2) reader.ReadInt16(); // skip right
}
break;
}
else reader.ReadBytes(chunkSize); // skip unknown chunk
}
}
// ---- Analyze: average and percentiles ----
float avgAmp = amplitudes.Average(a => Math.Abs(a));
float percentile20 = amplitudes.OrderBy(Math.Abs).ElementAt((int)(amplitudes.Count * 0.2f));
float percentile50 = amplitudes.OrderBy(Math.Abs).ElementAt((int)(amplitudes.Count * 0.5f));
Console.WriteLine($"Average Amplitude: {avgAmp:F4}");
Console.WriteLine($"20th Percentile: {percentile20:F4}, 50th Percentile: {percentile50:F4}");
// ---- Detect local minima ----
List<int> minimaIndexes = new List<int>();
for (int i = 1; i < amplitudes.Count - 1; i++)
{
if (Math.Abs(amplitudes[i]) < Math.Abs(amplitudes[i - 1]) &&
Math.Abs(amplitudes[i]) < Math.Abs(amplitudes[i + 1]))
{
if (Math.Abs(amplitudes[i]) < percentile20)
minimaIndexes.Add(i);
}
}//for (int i = 1; i < amplitudes.Count - 1; i++)
// ---- Extract segments between minima and save WAVs ----
for (int i = 0; i < minimaIndexes.Count - 1; i++)
{
int start = minimaIndexes[i];
int end = minimaIndexes[i + 1];
var segment = amplitudes.GetRange(start, end - start);
string outputFile = Path.Combine(folder,
$"{fileNameOnly}_piece_{i + 1}_samples_{segment.Count}_ms_{(int)(segment.Count / (float)sampleRate * 1000)}.wav");
Write_SPLITTED_WavFile(outputFile, segment, sampleRate);
Console.WriteLine($"Saved: {outputFile}");
}//for (int i = 0; i < minimaIndexes.Count - 1; i++)
}//public static void DISCARDING___THIS_GENERATES_LARGE_NUMBER_OF_SPLITTED_FILES______SplitWavByLocalMinimals_Of_Amplitudes(string wavPath)
public static void Write_SPLITTED_WavFile(string path, List<float> normalizedSamples, int sampleRate)
{
short bitsPerSample = 16;
short channels = 1;
int byteRate = sampleRate * channels * bitsPerSample / 8;
int dataSize = normalizedSamples.Count * 2;
using (var writer = new BinaryWriter(File.Create(path)))
{
// RIFF header
writer.Write(Encoding.ASCII.GetBytes("RIFF"));
writer.Write(36 + dataSize);
writer.Write(Encoding.ASCII.GetBytes("WAVE"));
// fmt chunk
writer.Write(Encoding.ASCII.GetBytes("fmt "));
writer.Write(16);
writer.Write((short)1); // PCM
writer.Write((short)channels);
writer.Write(sampleRate);
writer.Write(byteRate);
writer.Write((short)(channels * bitsPerSample / 8));
writer.Write(bitsPerSample);
// data chunk
writer.Write(Encoding.ASCII.GetBytes("data"));
writer.Write(dataSize);
foreach (float sample in normalizedSamples)
writer.Write((short)(sample * 32767));
}
}//public static void Write_SPLITTED_WavFile(string path, List<float> normalizedSamples, int sampleRate)
public static double PrintWavDurationAndSampleCount(string wavPath)
{
double durationMs = 0;
string ___report = "";
using (var reader = new BinaryReader(File.OpenRead(wavPath)))
{
// Skip RIFF header
reader.ReadChars(4);
reader.ReadInt32();
reader.ReadChars(4);
int sampleRate = 0;
short channels = 1;
short bitsPerSample = 16;
int dataSize = 0;
// Read chunks
while (reader.BaseStream.Position < reader.BaseStream.Length)
{
string chunkId = new string(reader.ReadChars(4));
int chunkSize = reader.ReadInt32();
if (chunkId == "fmt ")
{
short audioFormat = reader.ReadInt16();
channels = reader.ReadInt16();
sampleRate = reader.ReadInt32();
reader.ReadInt32(); // byteRate
reader.ReadInt16(); // blockAlign
bitsPerSample = reader.ReadInt16();
if (chunkSize > 16)
reader.ReadBytes(chunkSize - 16);
}
else if (chunkId == "data")
{
dataSize = chunkSize;
break;
}
else
{
reader.ReadBytes(chunkSize); // skip unknown chunk
}
}//while (reader.BaseStream.Position < reader.BaseStream.Length)
if (sampleRate == 0 || dataSize == 0)
{
Console.WriteLine("Failed to read sample rate or data size.");
return 0;
}//if (sampleRate == 0 || dataSize == 0)
int bytesPerSample = bitsPerSample / 8 * channels;
int totalSamples = dataSize / bytesPerSample;
durationMs = (totalSamples / (double)sampleRate) * 1000;
Console.WriteLine($"Sample Rate : {sampleRate} Hz");
Console.WriteLine($"Channels : {channels}");
Console.WriteLine($"Bits Per Sample : {bitsPerSample}");
Console.WriteLine($"Total Samples : {totalSamples}");
Console.WriteLine($"Total Duration : {durationMs:F2} ms");
___report= ___report + "\r\n"+ ($"Sample Rate : {sampleRate} Hz");
___report = ___report + "\r\n" + ($"Channels : {channels}");
___report = ___report + "\r\n" + ($"Bits Per Sample : {bitsPerSample}");
___report = ___report + "\r\n" + ($"Total Samples : {totalSamples}");
___report = ___report + "\r\n" + ($"Total Duration : {durationMs:F2} ms");
System.IO.File.WriteAllText(wavPath + "_reportfor_gtsmps.txt", ___report);
}//using (var reader = new BinaryReader(File.OpenRead(wavPath)))
return durationMs;
}//public static void PrintWavDurationAndSampleCount(string wavPath)
public static void ConvertWavToGTAMPS___with_corrections_GPT(string wavPath, string outputGtampsPath)
{
short channels = 1;
int sampleRate = 8000;
short bitsPerSample = 16;
using (var reader = new BinaryReader(File.OpenRead(wavPath)))
{
// 1. Read RIFF header
if (new string(reader.ReadChars(4)) != "RIFF")
throw new Exception("Not a valid RIFF file.");
reader.ReadInt32(); // File size
if (new string(reader.ReadChars(4)) != "WAVE")
throw new Exception("Not a valid WAVE file.");
// 2. Find 'fmt ' subchunk
channels = 1;
sampleRate = 8000;
bitsPerSample = 16;
while (true)
{
string chunkId = new string(reader.ReadChars(4));
int chunkSize = reader.ReadInt32();
if (chunkId == "fmt ")
{
short audioFormat = reader.ReadInt16();
channels = reader.ReadInt16();
sampleRate = reader.ReadInt32();
reader.ReadInt32(); // byteRate
reader.ReadInt16(); // blockAlign
bitsPerSample = reader.ReadInt16();
if (chunkSize > 16)
reader.ReadBytes(chunkSize - 16); // skip extra fmt bytes
break;
}
else
{
reader.ReadBytes(chunkSize); // skip unknown chunk
}
}
// 3. Find 'data' subchunk
while (true)
{
string chunkId = new string(reader.ReadChars(4));
int chunkSize = reader.ReadInt32();
if (chunkId == "data")
{
int bytesPerSample = bitsPerSample / 8;
int totalSamples = chunkSize / bytesPerSample;
var amplitudes = new List<float>();
for (int i = 0; i < totalSamples; i++)
{
if (reader.BaseStream.Position + bytesPerSample > reader.BaseStream.Length)
break;
short sample = reader.ReadInt16();
float norm = sample / 32768f;
amplitudes.Add(norm);
if (channels == 2)
reader.ReadInt16(); // skip right channel
}
// 4. Resample if needed
if (sampleRate != 8000)
{
var resampled = new List<float>();
double factor = sampleRate / 8000.0;
for (int i = 0; i < amplitudes.Count / factor; i++)
{
double idx = i * factor;
int i0 = (int)idx;
double frac = idx - i0;
float val = (i0 + 1 < amplitudes.Count)
? (float)((1 - frac) * amplitudes[i0] + frac * amplitudes[i0 + 1])
: amplitudes[i0];
resampled.Add(val);
}
amplitudes = resampled;
}
// 5. Save GTAMPS
File.WriteAllLines(outputGtampsPath, amplitudes.Select(a => a.ToString("F8")));
Console.WriteLine($"Saved GTAMPS: {outputGtampsPath}");
System.Windows.Forms.MessageBox.Show($"Saved GTAMPS: {outputGtampsPath} amplitudes = {amplitudes.Count}");
// string outputGtampsPath_generated = wavPath + "_actual_sampleRate=" + sampleRate + "_actual_bps=" + bitsPerSample + "_numSamples=" + numSamples + "_smpls=" + samples + "_8000Hz_16_bits_pcms_" + ".GTAMPS";
//samples
// Save as .GTAMPS
// File.WriteAllLines(outputGtampsPath_generated, samples.Select(s => s.ToString("F8")));
return;
}
else
{
reader.ReadBytes(chunkSize); // skip unknown chunk
}
}
throw new Exception("Data chunk not found.");
}
}//public static void ConvertWavToGTAMPS___with_corrections_GPT(string wavPath, string outputGtampsPath)
////// public static void ConvertWavToGTAMPS___with_corrections_GPT(string wavPath, string outputGtampsPath)
////// {
////// using (var reader = new BinaryReader(File.OpenRead(wavPath)))
////// {
////// // 1. Read RIFF header
////// if (new string(reader.ReadChars(4)) != "RIFF")
////// throw new Exception("Not a valid RIFF file.");
////// reader.ReadInt32(); // File size
////// if (new string(reader.ReadChars(4)) != "WAVE")
////// throw new Exception("Not a valid WAVE file.");
////// // 2. Find 'fmt ' subchunk
////// short channels = 1;
////// int sampleRate = 8000;
////// short bitsPerSample = 16;
////// while (true)
////// {
////// string chunkId = new string(reader.ReadChars(4));
////// int chunkSize = reader.ReadInt32();
////// if (chunkId == "fmt ")
////// {
////// short audioFormat = reader.ReadInt16();
////// channels = reader.ReadInt16();
////// sampleRate = reader.ReadInt32();
////// reader.ReadInt32(); // byteRate
////// reader.ReadInt16(); // blockAlign
////// bitsPerSample = reader.ReadInt16();
////// if (chunkSize > 16)
////// reader.ReadBytes(chunkSize - 16); // skip extra fmt bytes
////// break;
////// }
////// else
////// {
////// reader.ReadBytes(chunkSize); // skip unknown chunk
////// }
////// }
////// // 3. Find 'data' subchunk
////// while (true)
////// {
////// string chunkId = new string(reader.ReadChars(4));
////// int chunkSize = reader.ReadInt32();
////// if (chunkId == "data")
////// {
////// int bytesPerSample = bitsPerSample / 8;
////// int totalSamples = chunkSize / bytesPerSample;
////// var amplitudes = new List<float>();
////// for (int i = 0; i < totalSamples; i++)
////// {
////// if (reader.BaseStream.Position + bytesPerSample > reader.BaseStream.Length)
////// { break; }
////// short sample = reader.ReadInt16();
////// float norm = sample / 32768f;
////// amplitudes.Add(norm);
////// if (channels == 2)
////// {
////// reader.ReadInt16(); // skip right channel}
////// }// for (int i = 0; i < totalSamples; i++)
////// // 4. Resample if needed
////// if (sampleRate != 8000)
////// {
////// var resampled = new List<float>();
////// double factor = sampleRate / 8000.0;
////// for (int rrr = 0; rrr < amplitudes.Count / factor; rrr++)
////// {
////// double idx = rrr * factor;
////// int i0 = (int)idx;
////// double frac = idx - i0;
////// float val = (i0 + 1 < amplitudes.Count)
////// ? (float)((1 - frac) * amplitudes[i0] + frac * amplitudes[i0 + 1])
////// : amplitudes[i0];
////// resampled.Add(val);
////// }//for (int rrr = 0; rrr < amplitudes.Count / factor; rrr++)
////// amplitudes = resampled;
////// }//if (sampleRate != 8000)
////// // 5. Save GTAMPS
////// // File.WriteAllLines(outputGtampsPath, amplitudes.Select(a => a.ToString("F8")));
////// // Console.WriteLine($"Saved GTAMPS: {outputGtampsPath}");
////// string outputGtampsPath_generated = wavPath + "_actual_sampleRate=" + sampleRate + "_actual_bps=" + bitsPerSample + "_numSamples=" + numSamples + "_smpls=" + samples + "_8000Hz_16_bits_pcms_" + ".GTAMPS";
////// //samples
////// // Save as .GTAMPS
////// File.WriteAllLines(outputGtampsPath_generated, samples.Select(s => s.ToString("F8")));
////// return;
////// }
////// else
////// {
////// reader.ReadBytes(chunkSize); // skip unknown chunk
////// }
////// }
////// throw new Exception("Data chunk not found.");
////// }
////// }//public static void ConvertWavToGTAMPS___with_corrections_GPT(string wavPath, string outputGtampsPath)
////// public static void ConvertANY_KIND_OF_WavToGTAMPS(string wavPath, string outputGtampsPath)
////// {
////// using (var reader = new BinaryReader(File.OpenRead(wavPath)))
////// {
////// // Read RIFF header
////// string riff = new string(reader.ReadChars(4));
////// int fileSize = reader.ReadInt32();
////// string wave = new string(reader.ReadChars(4));
////// // Read format chunk
////// string fmt = new string(reader.ReadChars(4));
////// int fmtSize = reader.ReadInt32();
////// short audioFormat = reader.ReadInt16();
////// short channels = reader.ReadInt16();
////// int sampleRate = reader.ReadInt32();
////// int byteRate = reader.ReadInt32();
////// short blockAlign = reader.ReadInt16();
////// short bitsPerSample = reader.ReadInt16();
////// // Skip any extra bytes if fmt chunk > 16
////// if (fmtSize > 16)
////// { reader.ReadBytes(fmtSize - 16); }
////// // Seek to data chunk
////// while (new string(reader.ReadChars(4)) != "data")
////// {
////// reader.BaseStream.Position -= 3;
////// }//while (new string(reader.ReadChars(4)) != "data")
////// int dataSize = reader.ReadInt32();
////// int numSamples = dataSize / (bitsPerSample / 8);
////// var samples = new List<float>(numSamples);
////// for (int i = 0; i < numSamples; i++)
////// {
////// short sample16 = reader.ReadInt16();
////// float normalized = sample16 / 32768f;
////// samples.Add(normalized);
////// if (channels == 2) reader.ReadInt16(); // Skip second channel if stereo
////// }//for (int i = 0; i < numSamples; i++)
////// // Resample if needed (e.g., from 44100Hz to 8000Hz)
////// if (sampleRate != 8000)
////// {
////// var resampled = new List<float>();
////// double factor = sampleRate / 8000.0;
////// for (int i = 0; i < samples.Count / factor; i++)
////// {
////// double index = i * factor;
////// int idx = (int)index;
////// double frac = index - idx;
////// float sample = (idx + 1 < samples.Count)
////// ? (float)((1 - frac) * samples[idx] + frac * samples[idx + 1])
////// : samples[idx];
////// resampled.Add(sample);
////// }//for (int i = 0; i < samples.Count / factor; i++)
////// samples = resampled;
////// }//if (sampleRate != 8000)
////// string outputGtampsPath_generated= wavPath+ "_actual_sampleRate=" + sampleRate + "_actual_bps="+ bitsPerSample + "_numSamples=" + numSamples + "_smpls="+ samples+ "_8000Hz_16_bits_pcms_" + ".GTAMPS";
////// //samples
////// // Save as .GTAMPS
////// File.WriteAllLines(outputGtampsPath_generated, samples.Select(s => s.ToString("F8")));
////// // Console.WriteLine($"Saved GTAMPS to: {outputGtampsPath}");
////// System.Windows.Forms.MessageBox.Show($"Saved GTAMPS to: {outputGtampsPath}");
////// }//using (var reader = new BinaryReader(File.OpenRead(wavPath)))
////// }//public static void ConvertWavToGTAMPS(string wavPath, string outputGtampsPath)
}// public class SAANS_NO_3RD_PARTY_GPT_STYLES_WAV_FILES_READER_TO_GENERATE_8000_HZ_16_BIT_PCMS_GTAMPS
public class WavGenerator___44_SHRUTIS_BACKWARD_TO_FORWARDS_Reads_GTAMPS_MONO_8000_Hz_Samples_16_bits_no_3rd_party_apis
{
const int SampleRate = 8000;
const int BitsPerSample = 16;
const int Channels = 1;
const double Pi = Math.PI;
public static void SAANS___44_SAMPLES_WavGenerator___Reads_GTAMPS_MONO_8000_Hz_Samples_16_bits_no_3rd_party_apis___Main(string gtamps_filesnames)
{
string inputPath = gtamps_filesnames;// "your_file_path_here.txt";
// Read float samples
var samples = File.ReadLines(inputPath)
.Where(line => double.TryParse(line, out _))
.Select(double.Parse)
.ToList();
var allShifted = new List<short>();
for (int r = 1; r <= 22; r++)
{
double shiftFactor = Math.Pow(2, r / 22.0);
var shifted = ResampleWithFrequencyShift(samples, shiftFactor);
allShifted.AddRange(shifted);
}//for (int r = 1; r <= 22; r++)
for (int r = -22; r <= 0; r++)
{
double shiftFactor = Math.Pow(2, r / 22.0);
var shifted = ResampleWithFrequencyShift(samples, shiftFactor);
allShifted.AddRange(shifted);
}//for (int r = -22; r <= 0; r++)
string outputPath = inputPath + "___44_SCALES_8000hZ_16_BITS_PCMS_" + allShifted.Count.ToString() + "_output.wav";
WriteWavFile(outputPath, allShifted);
Console.WriteLine("WAV file written to: " + outputPath);
}//public static void SAANS___44_SAMPLES_WavGenerator___Reads_GTAMPS_MONO_8000_Hz_Samples_16_bits_no_3rd_party_apis___Main(STRING gtamps_filesnames)
public static List<short> ResampleWithFrequencyShift(List<double> samples, double shiftFactor)
{
int newLength = (int)(samples.Count / shiftFactor);
var shifted = new List<short>(newLength);
for (int i = 0; i < newLength; i++)
{
double srcIndex = i * shiftFactor;
int idx = (int)srcIndex;
double frac = srcIndex - idx;
double value = 0;
if (idx + 1 < samples.Count)
value = (1 - frac) * samples[idx] + frac * samples[idx + 1];
else if (idx < samples.Count)
value = samples[idx];
short pcmVal = (short)(value * short.MaxValue);
shifted.Add(pcmVal);
}//for (int i = 0; i < newLength; i++)
return shifted;
}//public static List<short> ResampleWithFrequencyShift(List<double> samples, double shiftFactor)
public static void WriteWavFile(string filePath, List<short> samples)
{
using (var stream = new FileStream(filePath, FileMode.Create))
using (var writer = new BinaryWriter(stream))
{
int byteRate = SampleRate * Channels * BitsPerSample / 8;
int dataSize = samples.Count * BitsPerSample / 8;
// RIFF header
writer.Write(Encoding.ASCII.GetBytes("RIFF"));
writer.Write(36 + dataSize);
writer.Write(Encoding.ASCII.GetBytes("WAVE"));
// fmt subchunk
writer.Write(Encoding.ASCII.GetBytes("fmt "));
writer.Write(16); // PCM
writer.Write((short)1); // AudioFormat = PCM
writer.Write((short)Channels);
writer.Write(SampleRate);
writer.Write(byteRate);
writer.Write((short)(Channels * BitsPerSample / 8));
writer.Write((short)BitsPerSample);
// data subchunk
writer.Write(Encoding.ASCII.GetBytes("data"));
writer.Write(dataSize);
foreach (short s in samples)
{ writer.Write(s); }
}//using (var writer = new BinaryWriter(stream))
}//public static void WriteWavFile(string filePath, List<short> samples)
}// public class WavGenerator___44_SHRUTIS_BACKWARD_TO_FORWARDS_Reads_GTAMPS_MONO_8000_Hz_Samples_16_bits_no_3rd_party_apis
/// <summary>
/// /////////////////////////////////////////////////////////////////////////////////////
/// </summary>
public class WavGenerator___Reads_GTAMPS_MONO_8000_Hz_Samples_16_bits_no_3rd_party_apis
{
const int SampleRate = 8000;
const int BitsPerSample = 16;
const int Channels = 1;
const double Pi = Math.PI;
public static void SAANS___WavGenerator___Reads_GTAMPS_MONO_8000_Hz_Samples_16_bits_no_3rd_party_apis___Main(string gtamps_filesnames)
{
string inputPath = gtamps_filesnames;// "your_file_path_here.txt";
// Read float samples
var samples = File.ReadLines(inputPath)
.Where(line => double.TryParse(line, out _))
.Select(double.Parse)
.ToList();
var allShifted = new List<short>();
for (int r = 1; r <= 22; r++)
{
double shiftFactor = Math.Pow(2, r / 22.0);
var shifted = ResampleWithFrequencyShift(samples, shiftFactor);
allShifted.AddRange(shifted);
}//for (int r = 1; r <= 22; r++)
string outputPath = inputPath + "___22_times_8000hZ_16_BITS_PCMS_"+allShifted.Count.ToString() + "_output.wav";
WriteWavFile(outputPath, allShifted);
Console.WriteLine("WAV file written to: " + outputPath);
}//public static void SAANS___WavGenerator___Reads_GTAMPS_MONO_8000_Hz_Samples_16_bits_no_3rd_party_apis___Main(STRING gtamps_filesnames)
public static List<short> ResampleWithFrequencyShift(List<double> samples, double shiftFactor)
{
int newLength = (int)(samples.Count / shiftFactor);
var shifted = new List<short>(newLength);
for (int i = 0; i < newLength; i++)
{
double srcIndex = i * shiftFactor;
int idx = (int)srcIndex;
double frac = srcIndex - idx;
double value = 0;
if (idx + 1 < samples.Count)
value = (1 - frac) * samples[idx] + frac * samples[idx + 1];
else if (idx < samples.Count)
value = samples[idx];
short pcmVal = (short)(value * short.MaxValue);
shifted.Add(pcmVal);
}//for (int i = 0; i < newLength; i++)
return shifted;
}//public static List<short> ResampleWithFrequencyShift(List<double> samples, double shiftFactor)
public static void WriteWavFile(string filePath, List<short> samples)
{
using (var stream = new FileStream(filePath, FileMode.Create))
using (var writer = new BinaryWriter(stream))
{
int byteRate = SampleRate * Channels * BitsPerSample / 8;
int dataSize = samples.Count * BitsPerSample / 8;
// RIFF header
writer.Write(Encoding.ASCII.GetBytes("RIFF"));
writer.Write(36 + dataSize);
writer.Write(Encoding.ASCII.GetBytes("WAVE"));
// fmt subchunk
writer.Write(Encoding.ASCII.GetBytes("fmt "));
writer.Write(16); // PCM
writer.Write((short)1); // AudioFormat = PCM
writer.Write((short)Channels);
writer.Write(SampleRate);
writer.Write(byteRate);
writer.Write((short)(Channels * BitsPerSample / 8));
writer.Write((short)BitsPerSample);
// data subchunk
writer.Write(Encoding.ASCII.GetBytes("data"));
writer.Write(dataSize);
foreach (short s in samples)
{ writer.Write(s); }
}//using (var writer = new BinaryWriter(stream))
}//public static void WriteWavFile(string filePath, List<short> samples)
}//public class WavGenerator___Reads_GTAMPS_MONO_8000_Hz_Samples_16_bits_no_3rd_party_apis
}//namespace SAAN_FRESH___RAW_NON_APIS_WAVES_TO_SHRUTIES_COPIER_GPTS
No comments:
Post a Comment