public static bool Read_Pac1(string filename, ref Direct_Sound[] Direct_Data, ref ImageSourceData[] IS_Data, ref Environment.Receiver_Bank[] Receiver) { System.IO.BinaryReader sr = new System.IO.BinaryReader(System.IO.File.Open(filename, System.IO.FileMode.Open)); try { //1. Date & Time string Savedate = sr.ReadString(); //2. Plugin Version string Pach_version = sr.ReadString(); //3. Cut off Time and SampleRate double CO_TIME = sr.ReadDouble(); int SampleRate = sr.ReadInt32(); //4. Source Count int SrcCt = 1; if (double.Parse(Pach_version.Substring(0, 3)) >= 1.1) { SrcCt = sr.ReadInt32(); } //4.1 Source Location x //4.2 Source Location y //4.3 Source Location z Hare.Geometry.Point[] SrcPt = new Hare.Geometry.Point[SrcCt]; for (int s = 0; s < SrcCt; s++) { SrcPt[s] = new Hare.Geometry.Point(sr.ReadDouble(), sr.ReadDouble(), sr.ReadDouble()); } //5. No of Receivers int Rec_Ct = sr.ReadInt32(); //6. Write the coordinates of each receiver point //6b. Write the environmental characteristics at each receiver point (Rho * C); V2.0 only... Hare.Geometry.Point[] Recs = new Hare.Geometry.Point[Rec_Ct]; double[] Rho_C = new double[Rec_Ct]; for (int q = 0; q < Rec_Ct; q++) { Recs[q] = new Hare.Geometry.Point(sr.ReadDouble(), sr.ReadDouble(), sr.ReadDouble()); if (double.Parse(Pach_version.Substring(0, 3)) >= 2.0) { Rho_C[q] = sr.ReadDouble(); } else { Rho_C[q] = 400; } } Direct_Data = new Direct_Sound[SrcCt]; IS_Data = new ImageSourceData[SrcCt]; Receiver = new Environment.Receiver_Bank[SrcCt]; int DDCT = 0; int ISCT = 0; int RTCT = 0; do { string readin = sr.ReadString(); switch (readin) { case "Direct_Sound": case "Direct_Sound w sourcedata": //9. Read Direct Sound Data Direct_Data[DDCT] = Direct_Sound.Read_Data(ref sr, Recs, SrcPt[DDCT], Rho_C, Pach_version); Direct_Data[DDCT].CO_Time = CO_TIME; Direct_Data[DDCT].SampleFreq = (int)SampleRate; DDCT++; break; case "Image-Source_Data": //10. Read Image Source Sound Data IS_Data[ISCT] = ImageSourceData.Read_Data(ref sr, Recs.Length, Direct_Data[DDCT - 1], false, ISCT, Pach_version); ISCT++; break; case "Ray-Traced_Data": //11. Read Ray Traced Sound Data Receiver[RTCT] = Environment.Receiver_Bank.Read_Data(ref sr, Direct_Data[RTCT].SWL, Rec_Ct, Recs, Rho_C, Direct_Data[RTCT].Delay_ms, ref SampleRate, Pach_version); RTCT++; break; case "End": sr.Close(); return(true); } } while (true); } catch (System.Exception X) { sr.Close(); System.Windows.Forms.MessageBox.Show("File Read Failed...", String.Format("Results file was corrupt or incomplete. We apologize for this inconvenience. Please report this to the software author. It will be much appreciated. \r\n Exception Message: {0}. \r\n Method: {1}", X.Message, X.TargetSite)); return(false); } }
public static bool Read_Pac1(string filename, ref Direct_Sound[] Direct_Data, ref ImageSourceData[] IS_Data, ref Environment.Receiver_Bank[] Receiver) { System.IO.BinaryReader sr = new System.IO.BinaryReader(System.IO.File.Open(filename, System.IO.FileMode.Open)); try { //1. Date & Time string Savedate = sr.ReadString(); //2. Plugin Version string Pach_version = sr.ReadString(); //3. Cut off Time and SampleRate double CO_TIME = sr.ReadDouble(); int SampleRate = sr.ReadInt32(); //4. Source Count int SrcCt = 1; if (double.Parse(Pach_version.Substring(0, 3)) >= 1.1) SrcCt = sr.ReadInt32(); //4.1 Source Location x //4.2 Source Location y //4.3 Source Location z Hare.Geometry.Point[] SrcPt = new Hare.Geometry.Point[SrcCt]; for (int s = 0; s < SrcCt; s++) SrcPt[s] = new Hare.Geometry.Point(sr.ReadDouble(), sr.ReadDouble(), sr.ReadDouble()); //5. No of Receivers int Rec_Ct = sr.ReadInt32(); //6. Write the coordinates of each receiver point //6b. Write the environmental characteristics at each receiver point (Rho * C); V2.0 only... Hare.Geometry.Point[] Recs = new Hare.Geometry.Point[Rec_Ct]; double[] Rho_C = new double[Rec_Ct]; for (int q = 0; q < Rec_Ct; q++) { Recs[q] = new Hare.Geometry.Point(sr.ReadDouble(), sr.ReadDouble(), sr.ReadDouble()); if (double.Parse(Pach_version.Substring(0, 3)) >= 2.0) Rho_C[q] = sr.ReadDouble(); else Rho_C[q] = 400; } Direct_Data = new Direct_Sound[SrcCt]; IS_Data = new ImageSourceData[SrcCt]; Receiver = new Environment.Receiver_Bank[SrcCt]; int DDCT = 0; int ISCT = 0; int RTCT = 0; do { string readin = sr.ReadString(); switch (readin) { case "Direct_Sound": case "Direct_Sound w sourcedata": //9. Read Direct Sound Data Direct_Data[DDCT] = Direct_Sound.Read_Data(ref sr, Recs, SrcPt[DDCT], Rho_C, Pach_version); Direct_Data[DDCT].CO_Time = CO_TIME; Direct_Data[DDCT].SampleFreq = (int)SampleRate; DDCT++; break; case "Image-Source_Data": //10. Read Image Source Sound Data IS_Data[ISCT] = ImageSourceData.Read_Data(ref sr, Recs.Length, Direct_Data[DDCT - 1], false, ISCT, Pach_version); ISCT++; break; case "Ray-Traced_Data": //11. Read Ray Traced Sound Data Receiver[RTCT] = Environment.Receiver_Bank.Read_Data(ref sr, Rec_Ct, Recs, Rho_C, Direct_Data[RTCT].Delay_ms, ref SampleRate, Pach_version); RTCT++; break; case "End": sr.Close(); return true; } } while (true); } catch (System.Exception X) { sr.Close(); System.Windows.Forms.MessageBox.Show("File Read Failed...", String.Format("Results file was corrupt or incomplete. We apologize for this inconvenience. Please report this to the software author. It will be much appreciated. \r\n Exception Message: {0}. \r\n Method: {1}" , X.Message, X.TargetSite)); return false; } }
public static double[][] PTCurve_Ambisonics3(IEnumerable<Direct_Sound> Direct, IEnumerable<ImageSourceData> ISData, IEnumerable<Environment.Receiver_Bank> RTData, double CO_Time_ms, int Sampling_Frequency, int Rec_ID, List<int> SrcIDs, bool StartAtZero, double alt, double azi, bool degrees) { double[][] Histogram = new double[7][]; if (Direct == null) Direct = new Direct_Sound[SrcIDs[SrcIDs.Count - 1] + 1]; if (ISData == null) ISData = new ImageSourceData[SrcIDs[SrcIDs.Count - 1] + 1]; if (RTData == null) RTData = new Environment.Receiver_Bank[SrcIDs[SrcIDs.Count - 1] + 1]; double maxdelay = 0; List<double> delays = new List<double>(); if (Direct.ElementAt<Direct_Sound>(0) != null) { foreach (Direct_Sound d in Direct) { delays.Add(d.Delay_ms); maxdelay = Math.Max(maxdelay, d.Delay_ms); } } else if (RTData.ElementAt<Receiver_Bank>(0) != null) { foreach (Receiver_Bank r in RTData) { delays.Add(r.delay_ms); maxdelay = Math.Max(maxdelay, r.delay_ms); } } maxdelay *= Sampling_Frequency / 1000; Histogram[0] = new double[(int)(CO_Time_ms * 0.001 * Sampling_Frequency) + 4096 + (int)Math.Ceiling(maxdelay)]; Histogram[1] = new double[(int)(CO_Time_ms * 0.001 * Sampling_Frequency) + 4096 + (int)Math.Ceiling(maxdelay)]; Histogram[2] = new double[(int)(CO_Time_ms * 0.001 * Sampling_Frequency) + 4096 + (int)Math.Ceiling(maxdelay)]; Histogram[3] = new double[(int)(CO_Time_ms * 0.001 * Sampling_Frequency) + 4096 + (int)Math.Ceiling(maxdelay)]; Histogram[4] = new double[(int)(CO_Time_ms * 0.001 * Sampling_Frequency) + 4096 + (int)Math.Ceiling(maxdelay)]; Histogram[5] = new double[(int)(CO_Time_ms * 0.001 * Sampling_Frequency) + 4096 + (int)Math.Ceiling(maxdelay)]; Histogram[6] = new double[(int)(CO_Time_ms * 0.001 * Sampling_Frequency) + 4096 + (int)Math.Ceiling(maxdelay)]; foreach (int s in SrcIDs) { double[][] IR = PTCurve_Ambisonics3(Direct.ElementAt<Direct_Sound>(s), ISData.ElementAt<ImageSourceData>(s), RTData.ElementAt<Receiver_Bank>(s), CO_Time_ms, Sampling_Frequency, Rec_ID, StartAtZero, alt, azi, degrees); for (int d = 0; d < IR.Length; d++) { for (int i = 0; i < IR[0].Length; i++) { Histogram[d][i + (int)Math.Ceiling(delays[s] / 1000 * Sampling_Frequency)] += IR[d][i]; } } } return Histogram; }
public static double[] PTCurve(Direct_Sound Direct, ImageSourceData ISData, Environment.Receiver_Bank RTData, double CO_Time_ms, int samplerate, int Octave, int Rec_ID, bool StartAtZero, Numerics.ComplexComponent Output_Type) { Direct_Sound[] ArrDirect = new Direct_Sound[1]; ArrDirect[0] = Direct; ImageSourceData[] ArrIS = new ImageSourceData[1]; ArrIS[0] = ISData; Environment.Receiver_Bank[] ArrRT = new Environment.Receiver_Bank[1]; ArrRT[0] = RTData; double[] P; PTCurve(ArrDirect, ArrIS, ArrRT, CO_Time_ms*0.001, samplerate, Rec_ID, 0, StartAtZero, out P); double[] Pressure = new double[P.Length]; for (int i = 0; i < Pressure.Length; i++) Pressure[i] = P[i]; return Pressure; }
public static double[] ETCurve(Direct_Sound Direct, ImageSourceData ISData, Environment.Receiver_Bank RTData, double CO_Time_ms, int samplerate, int Octave, int Rec_ID, bool StartAtZero) { Direct_Sound[] ArrDirect = new Direct_Sound[1]; ArrDirect[0] = Direct; ImageSourceData[] ArrIS = new ImageSourceData[1]; ArrIS[0] = ISData; Receiver_Bank[] ArrRT = new Environment.Receiver_Bank[1]; ArrRT[0] = RTData; return ETCurve(ArrDirect, ArrIS, ArrRT, CO_Time_ms, samplerate, Octave, Rec_ID, 0, StartAtZero); }
public static double[] PTCurve(Direct_Sound[] Direct, ImageSourceData[] ISData, Environment.Receiver_Bank[] RTData, double CO_Time_ms, int Sampling_Frequency, int Rec_ID, List<int> SrcIDs, bool StartAtZero) { if (Direct == null) Direct = new Direct_Sound[SrcIDs[SrcIDs.Count - 1] + 1]; if (ISData == null) ISData = new ImageSourceData[SrcIDs[SrcIDs.Count - 1] + 1]; if (RTData == null) RTData = new Environment.Receiver_Bank[SrcIDs[SrcIDs.Count - 1] + 1]; double maxdelay = 0; List<double> delays = new List<double>(); if (Direct.ElementAt<Direct_Sound>(0) != null) { foreach (Direct_Sound d in Direct) { delays.Add(d.Delay_ms); maxdelay = Math.Max(maxdelay, d.Delay_ms); } } else if (RTData.ElementAt<Receiver_Bank>(0) != null) { foreach (Receiver_Bank r in RTData) { delays.Add(r.delay_ms); maxdelay = Math.Max(maxdelay, r.delay_ms); } } maxdelay *= Sampling_Frequency / 1000; double[] Histogram = new double[(int)(CO_Time_ms * 0.001 * Sampling_Frequency) + 4096*2 + (int)Math.Ceiling(maxdelay)]; foreach (int s in SrcIDs) { double[] P; PTCurve(Direct, ISData, RTData, CO_Time_ms, Sampling_Frequency, Rec_ID, s, StartAtZero, out P); for (int i = 0; i < P.Length; i++) { Histogram[i + (int)Math.Ceiling(delays[s] /1000 * Sampling_Frequency)] += P[i]; } } return Histogram; }