private void DrawPatternBitmapNote(Project project, int t0, int t1, Note note, int patternSizeX, int patternSizeY, int noteSizeY, int minNote, int maxNote, float scaleY, bool dpcm, int[] data) { var y = Math.Min((int)Math.Round((note.Value - minNote) / (float)(maxNote - minNote) * scaleY * patternSizeY), patternSizeY - noteSizeY); var instrument = note.Instrument; var color = Theme.LightGreyFillColor1; if (dpcm) { var mapping = project.GetDPCMMapping(note.Value); if (mapping != null) { color = mapping.Sample.Color; } } else if (instrument != null) { color = instrument.Color; } for (int j = 0; j < noteSizeY; j++) { for (int x = t0; x < t1; x++) { data[(patternSizeY - 1 - (y + j)) * patternSizeX + x] = GLColorUtils.PackColorForTexture(color); } } }
public static void SavePatterns(Project project, Pattern[,] patterns, Song.PatternCustomSetting[] customSettings = null) { if (patterns == null) { SetClipboardDataInternal(null); return; } var uniqueInstruments = new HashSet <Instrument>(); var uniqueArpeggios = new HashSet <Arpeggio>(); var uniquePatterns = new HashSet <Pattern>(); var uniqueDPCMMappings = new Dictionary <int, DPCMSampleMapping>(); var numPatterns = patterns.GetLength(0); var numChannels = patterns.GetLength(1); Debug.Assert(customSettings == null || customSettings.Length == numPatterns); for (int i = 0; i < numPatterns; i++) { for (int j = 0; j < numChannels; j++) { var pattern = patterns[i, j]; if (pattern != null) { uniquePatterns.Add(pattern); if (pattern.ChannelType == Channel.Dpcm) { foreach (var n in pattern.Notes.Values) { var mapping = project.GetDPCMMapping(n.Value); if (mapping != null && mapping.Sample != null) { uniqueDPCMMappings[n.Value] = mapping; } } } else { foreach (var n in pattern.Notes.Values) { if (n.Instrument != null) { uniqueInstruments.Add(n.Instrument); } if (n.Arpeggio != null) { uniqueArpeggios.Add(n.Arpeggio); } } } } } } if (uniquePatterns.Count == 0) { SetClipboardDataInternal(null); return; } var serializer = new ProjectSaveBuffer(null); SaveSampleList(serializer, uniqueDPCMMappings); SaveArpeggioList(serializer, uniqueArpeggios); SaveInstrumentList(serializer, uniqueInstruments); SavePatternList(serializer, uniquePatterns); serializer.Serialize(ref numPatterns); serializer.Serialize(ref numChannels); for (int i = 0; i < numPatterns; i++) { for (int j = 0; j < numChannels; j++) { var pattern = patterns[i, j]; var patId = pattern == null ? -1 : pattern.Id; serializer.Serialize(ref patId); } } var hasCustomSettings = customSettings != null; var tempoMode = project.TempoMode; serializer.Serialize(ref hasCustomSettings); serializer.Serialize(ref tempoMode); if (hasCustomSettings) { for (int i = 0; i < numPatterns; i++) { serializer.Serialize(ref customSettings[i].useCustomSettings); serializer.Serialize(ref customSettings[i].patternLength); serializer.Serialize(ref customSettings[i].noteLength); serializer.Serialize(ref customSettings[i].beatLength); } } var buffer = Compression.CompressBytes(serializer.GetBuffer(), CompressionLevel.Fastest); var clipboardData = new List <byte>(); clipboardData.AddRange(BitConverter.GetBytes(MagicNumberClipboardPatterns)); clipboardData.AddRange(buffer); SetClipboardDataInternal(clipboardData.ToArray()); }
public static void SaveNotes(Project project, Note[] notes, bool dpcm) { if (notes == null) { SetClipboardDataInternal(null); return; } var serializer = new ProjectSaveBuffer(null); var instruments = new HashSet <Instrument>(); var arpeggios = new HashSet <Arpeggio>(); var samples = new Dictionary <int, DPCMSampleMapping>(); if (dpcm) { foreach (var note in notes) { if (note != null) { var mapping = project.GetDPCMMapping(note.Value); if (mapping != null && mapping.Sample != null) { samples[note.Value] = mapping; } } } } else { foreach (var note in notes) { if (note != null) { if (note.Instrument != null) { instruments.Add(note.Instrument); } if (note.Arpeggio != null) { arpeggios.Add(note.Arpeggio); } } } } SaveSampleList(serializer, samples); SaveArpeggioList(serializer, arpeggios); SaveInstrumentList(serializer, instruments); var numNotes = notes.Length; serializer.Serialize(ref numNotes); foreach (var note in notes) { if (note == null) { Note.EmptyNote.SerializeState(serializer); } else { note.SerializeState(serializer); } } var buffer = Compression.CompressBytes(serializer.GetBuffer(), CompressionLevel.Fastest); var clipboardData = new List <byte>(); clipboardData.AddRange(BitConverter.GetBytes(MagicNumberClipboardNotes)); clipboardData.AddRange(buffer); SetClipboardDataInternal(clipboardData.ToArray()); }