public static Image DrawFalseColourSpectrograms(Arguments args, string fileStem, Dictionary <string, IndexProperties> indexProperties, Dictionary <string, double[, ]> spectra = null) { // note: the spectra are oriented as per visual orientation, i.e. xAxis = time framesDictionary<string, Int16>.KeyCollection keys = AuthorList.Keys // string[] keys = spectra.Keys.ToCommaSeparatedList().Split(','); // int frameCount = spectra[keys[0]].GetLength(1); int sampleRate = 22050; int frameWidth = 512; double backgroundFilter = 0.75; // 0.75 means small values are accentuated. var minuteOffset = TimeSpan.Zero; var dataScale = args.TemporalScale; string colourMap = args.ColourMap1 ?? LDSpectrogramRGB.DefaultColorMap1; var cs1 = new LDSpectrogramRGB(minuteOffset, dataScale, sampleRate, frameWidth, colourMap) { FileName = fileStem, BackgroundFilter = backgroundFilter, IndexCalculationDuration = dataScale, }; cs1.SetSpectralIndexProperties(indexProperties); // set the relevant dictionary of index properties cs1.SpectrogramMatrices = spectra; var image1 = cs1.DrawFalseColourSpectrogramChromeless("NEGATIVE", colourMap); var fullDuration = TimeSpan.FromSeconds(image1.Width * dataScale.TotalSeconds); string title = fileStem; var titleImage = LDSpectrogramRGB.DrawTitleBarOfFalseColourSpectrogram(title, image1.Width); int trackHeight = 20; var timeScale = ImageTrack.DrawTimeRelativeTrack(fullDuration, image1.Width, trackHeight); colourMap = args.ColourMap2 ?? LDSpectrogramRGB.DefaultColorMap2; var image2 = cs1.DrawFalseColourSpectrogramChromeless("NEGATIVE", colourMap); var list = new List <Image> { titleImage, image1, timeScale, image2 }; var combinedImage = ImageTools.CombineImagesVertically(list.ToArray()); return(combinedImage); }