static unsafe void Main(string[] args) { #if FAMISTUDIO_WINDOWS try { // This is only supported in Windows 8.1+. SetProcessDpiAwareness(1 /*Process_System_DPI_Aware*/); } catch { } #endif Settings.Load(); Cursors.Initialize(); RenderTheme.Initialize(); PlatformDialogs.Initialize(); #if FAMISTUDIO_WINDOWS PerformanceCounter.Initialize(); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); #endif var famiStudio = new FamiStudio(args.Length > 0 ? args[0] : null); famiStudio.Run(); Settings.Save(); }
private void ExportFamiTracker() { var filename = PlatformDialogs.ShowSaveFileDialog("Export FamiTracker Text File", "FamiTracker Text Format (*.txt)|*.txt"); if (filename != null) { var props = dialog.GetPropertyPage((int)ExportFormat.FamiTracker); FamitrackerFile.Save(project, filename, GetSongIds(props.GetPropertyValue <bool[]>(0))); } }
private void ExportWav() { var filename = PlatformDialogs.ShowSaveFileDialog("Export Wave File", "Wave Audio File (*.wav)|*.wav"); if (filename != null) { var props = dialog.GetPropertyPage((int)ExportFormat.Wav); var songName = props.GetPropertyValue <string>(0); var sampleRate = Convert.ToInt32(props.GetPropertyValue <string>(1)); WaveFile.Save(project.GetSong(songName), filename, sampleRate); } }
protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); if (isDraggingInstrument) { if (ClientRectangle.Contains(e.X, e.Y)) { var buttonIdx = GetButtonAtCoord(e.X, e.Y, out var subButtonType); var instrumentSrc = instrumentDrag; var instrumentDst = buttonIdx >= 0 && buttons[buttonIdx].type == ButtonType.Instrument ? buttons[buttonIdx].instrument : null; if (instrumentSrc != instrumentDst && instrumentSrc != null && instrumentDst != null) { if (envelopeDragIdx == -1) { if (PlatformDialogs.MessageBox($"Are you sure you want to replace all notes of instrument '{instrumentDst.Name}' with '{instrumentSrc.Name}'?", "Replace intrument", MessageBoxButtons.YesNo) == DialogResult.Yes) { App.UndoRedoManager.BeginTransaction(TransactionScope.Project); App.Project.ReplaceInstrument(instrumentDst, instrumentSrc); App.UndoRedoManager.EndTransaction(); InstrumentReplaced?.Invoke(instrumentDst); } } else { if (PlatformDialogs.MessageBox($"Are you sure you want to copy the {Envelope.EnvelopeStrings[envelopeDragIdx]} envelope of instrument '{instrumentSrc.Name}' to '{instrumentDst.Name}'?", "Copy Envelope", MessageBoxButtons.YesNo) == DialogResult.Yes) { App.UndoRedoManager.BeginTransaction(TransactionScope.Instrument, instrumentDst.Id); instrumentDst.Envelopes[envelopeDragIdx] = instrumentSrc.Envelopes[envelopeDragIdx].Clone(); App.UndoRedoManager.EndTransaction(); InstrumentEdited?.Invoke(instrumentDst, envelopeDragIdx); Invalidate(); } } } } else { InstrumentDraggedOutside(instrumentDrag, PointToScreen(new Point(e.X, e.Y))); } Capture = false; } CancelDrag(); }
public void Paste() { if (!IsSelectionValid()) { return; } var mergeInstruments = ClipboardUtils.ContainsMissingInstruments(App.Project, false); bool createMissingInstrument = false; if (mergeInstruments) { createMissingInstrument = PlatformDialogs.MessageBox($"You are pasting notes referring to unknown instruments. Do you want to create the missing instrument?", "Paste", MessageBoxButtons.YesNo) == DialogResult.Yes; } App.UndoRedoManager.BeginTransaction(createMissingInstrument ? TransactionScope.Project : TransactionScope.Song, Song.Id); var patterns = ClipboardUtils.LoadPatterns(App.Project, Song, createMissingInstrument); if (patterns == null) { App.UndoRedoManager.AbortTransaction(); return; } for (int i = 0; i < patterns.GetLength(0); i++) { for (int j = 0; j < patterns.GetLength(1); j++) { var pattern = patterns[i, j]; if (pattern != null && (i + minSelectedPatternIdx) < Song.Length) { Song.Channels[pattern.ChannelType].PatternInstances[i + minSelectedPatternIdx] = pattern; } } } App.UndoRedoManager.EndTransaction(); PatternsPasted?.Invoke(); ConditionalInvalidate(); }
private void ExportFamiTone2() { var props = dialog.GetPropertyPage((int)ExportFormat.FamiTone2); var formatString = props.GetPropertyValue <string>(0); var ext = formatString == "CA65" ? "s" : "asm"; var separate = props.GetPropertyValue <bool>(1); var songIds = GetSongIds(props.GetPropertyValue <bool[]>(4)); var exportFormat = (FamitoneMusicFile.OutputFormat)Enum.Parse(typeof(FamitoneMusicFile.OutputFormat), formatString); var songNamePattern = props.GetPropertyValue <string>(2); var dpcmNamePattern = props.GetPropertyValue <string>(3); if (separate) { var folderBrowserDialog = new FolderBrowserDialog(); folderBrowserDialog.Description = "Select the export folder"; if (folderBrowserDialog.ShowDialog() == DialogResult.OK) { foreach (var songId in songIds) { var song = project.GetSong(songId); var formattedSongName = songNamePattern.Replace("{project}", project.Name).Replace("{song}", song.Name); var formattedDpcmName = dpcmNamePattern.Replace("{project}", project.Name).Replace("{song}", song.Name); var songFilename = Path.Combine(folderBrowserDialog.SelectedPath, Utils.MakeNiceAsmName(formattedSongName) + "." + ext); var dpcmFilename = Path.Combine(folderBrowserDialog.SelectedPath, Utils.MakeNiceAsmName(formattedDpcmName) + ".dmc"); FamitoneMusicFile f = new FamitoneMusicFile(FamitoneMusicFile.FamiToneKernel.FamiTone2); f.Save(project, new int[] { songId }, exportFormat, true, songFilename, dpcmFilename); } } } else { var filename = PlatformDialogs.ShowSaveFileDialog("Export FamiTone2 Code", $"FamiTone2 Assembly File (*.{ext})|*.{ext}"); if (filename != null) { FamitoneMusicFile f = new FamitoneMusicFile(FamitoneMusicFile.FamiToneKernel.FamiTone2); f.Save(project, songIds, exportFormat, false, filename, Path.ChangeExtension(filename, ".dmc")); } } }
private void ExportNsf() { var filename = PlatformDialogs.ShowSaveFileDialog("Export NSF File", "Nintendo Sound Files (*.nsf)|*.nsf"); if (filename != null) { var props = dialog.GetPropertyPage((int)ExportFormat.Nsf); #if DEBUG var kernel = (FamitoneMusicFile.FamiToneKernel)Enum.Parse(typeof(FamitoneMusicFile.FamiToneKernel), props.GetPropertyValue <string>(5)); #else var kernel = FamitoneMusicFile.FamiToneKernel.FamiTone2FS; #endif NsfFile.Save(project, kernel, filename, GetSongIds(props.GetPropertyValue <bool[]>(4)), props.GetPropertyValue <string>(0), props.GetPropertyValue <string>(1), props.GetPropertyValue <string>(2)); } }
protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); bool left = e.Button.HasFlag(MouseButtons.Left); bool middle = e.Button.HasFlag(MouseButtons.Middle) || (e.Button.HasFlag(MouseButtons.Left) && ModifierKeys.HasFlag(Keys.Alt)); bool right = e.Button.HasFlag(MouseButtons.Right); var buttonIdx = GetButtonAtCoord(e.X, e.Y, out var subButtonType); if (buttonIdx >= 0) { var button = buttons[buttonIdx]; if (left) { if (button.type == ButtonType.SongHeader) { if (subButtonType == SubButtonType.Add) { App.UndoRedoManager.BeginTransaction(TransactionScope.Project); App.Project.CreateSong(); App.UndoRedoManager.EndTransaction(); RefreshButtons(); ConditionalInvalidate(); } } else if (button.type == ButtonType.Song) { if (button.song != selectedSong) { selectedSong = button.song; SongSelected?.Invoke(selectedSong); ConditionalInvalidate(); } } else if (button.type == ButtonType.InstrumentHeader) { if (subButtonType == SubButtonType.Add) { App.UndoRedoManager.BeginTransaction(TransactionScope.Project); App.Project.CreateInstrument(); App.UndoRedoManager.EndTransaction(); RefreshButtons(); ConditionalInvalidate(); } if (subButtonType == SubButtonType.LoadInstrument) { var filename = PlatformDialogs.ShowOpenFileDialog("Open File", "Fami Tracker Instrument (*.fti)|*.fti"); if (filename != null) { App.UndoRedoManager.BeginTransaction(TransactionScope.Project); var instrument = FamitrackerInstrumentFile.CreateFromFile(App.Project, filename); if (instrument == null) { App.UndoRedoManager.AbortTransaction(); } else { App.UndoRedoManager.EndTransaction(); } } RefreshButtons(); ConditionalInvalidate(); } } else if (button.type == ButtonType.Instrument) { selectedInstrument = button.instrument; if (selectedInstrument != null) { instrumentDrag = selectedInstrument; mouseDragY = e.Y; } if (subButtonType == SubButtonType.Volume) { InstrumentEdited?.Invoke(selectedInstrument, Envelope.Volume); envelopeDragIdx = Envelope.Volume; } else if (subButtonType == SubButtonType.Pitch) { InstrumentEdited?.Invoke(selectedInstrument, Envelope.Pitch); envelopeDragIdx = Envelope.Pitch; } else if (subButtonType == SubButtonType.Arpeggio) { InstrumentEdited?.Invoke(selectedInstrument, Envelope.Arpeggio); envelopeDragIdx = Envelope.Arpeggio; } else if (subButtonType == SubButtonType.DPCM) { InstrumentEdited?.Invoke(selectedInstrument, Envelope.Max); } else if (subButtonType >= SubButtonType.DutyCycle0 && subButtonType <= SubButtonType.DutyCycle3) { selectedInstrument.DutyCycle = (selectedInstrument.DutyCycle + 1) % 4; } InstrumentSelected?.Invoke(selectedInstrument); ConditionalInvalidate(); } } else if (right) { if (button.type == ButtonType.Song && App.Project.Songs.Count > 1) { var song = button.song; if (PlatformDialogs.MessageBox($"Are you sure you want to delete '{song.Name}' ?", "Delete song", MessageBoxButtons.YesNo) == DialogResult.Yes) { bool selectNewSong = song == selectedSong; App.Stop(); App.UndoRedoManager.BeginTransaction(TransactionScope.Project); App.Project.DeleteSong(song); if (selectNewSong) { selectedSong = App.Project.Songs[0]; } SongSelected?.Invoke(selectedSong); App.UndoRedoManager.EndTransaction(); RefreshButtons(); ConditionalInvalidate(); } } else if (button.type == ButtonType.Instrument && button.instrument != null) { var instrument = button.instrument; if (subButtonType == SubButtonType.Arpeggio || subButtonType == SubButtonType.Pitch || subButtonType == SubButtonType.Volume) { int envType = Envelope.Volume; switch (subButtonType) { case SubButtonType.Arpeggio: envType = Envelope.Arpeggio; break; case SubButtonType.Pitch: envType = Envelope.Pitch; break; } App.UndoRedoManager.BeginTransaction(TransactionScope.Instrument, instrument.Id); instrument.Envelopes[envType].Length = 0; App.UndoRedoManager.EndTransaction(); ConditionalInvalidate(); } else if (subButtonType == SubButtonType.Max) { if (PlatformDialogs.MessageBox($"Are you sure you want to delete '{instrument.Name}' ? All notes using this instrument will be deleted.", "Delete intrument", MessageBoxButtons.YesNo) == DialogResult.Yes) { bool selectNewInstrument = instrument == selectedInstrument; App.StopInstrumentNoteAndWait(); App.UndoRedoManager.BeginTransaction(TransactionScope.Project); App.Project.DeleteInstrument(instrument); if (selectNewInstrument) { selectedInstrument = App.Project.Instruments.Count > 0 ? App.Project.Instruments[0] : null; } SongSelected?.Invoke(selectedSong); InstrumentDeleted?.Invoke(instrument); App.UndoRedoManager.EndTransaction(); RefreshButtons(); ConditionalInvalidate(); } } } } } if (middle) { mouseLastY = e.Y; } }