1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
/**********************************************************************
Audacity: A Digital Audio Editor
@file ExportMIDI.cpp
Paul Licameli split from FileMenus.cpp
**********************************************************************/
#include <wx/frame.h>
#if defined(USE_MIDI)
//#include "strparse.h"
//#include "mfmidi.h"
#include "FileNames.h"
#include "NoteTrack.h"
#include "Project.h"
#include "ProjectWindows.h"
#include "SelectFile.h"
#include "AudacityMessageBox.h"
#include "FileDialog/FileDialog.h"
#include "ShuttleGui.h"
#include "prefs/ImportExportPrefs.h"
namespace {
void AddControls(ShuttleGui &S)
{
S.StartStatic(XO("Exported Allegro (.gro) files save time as:"));
{
#if defined(__WXMAC__)
// Bug 2692: Place button group in panel so tabbing will work and,
// on the Mac, VoiceOver will announce as radio buttons.
S.StartPanel();
#endif
{
S.StartRadioButtonGroup(NoteTrack::AllegroStyleSetting);
{
S.TieRadioButton();
S.TieRadioButton();
}
S.EndRadioButtonGroup();
}
#if defined(__WXMAC__)
S.EndPanel();
#endif
}
S.EndStatic();
}
ImportExportPrefs::RegisteredControls reg{
wxT("AllegroTimeOption"), AddControls };
}
// Insert a menu item
#include "CommandContext.h"
#include "MenuRegistry.h"
#include "CommonCommandFlags.h"
namespace {
const ReservedCommandFlag&
NoteTracksExistFlag() { static ReservedCommandFlag flag{
[](const AudacityProject &project){
return !TrackList::Get(project).Any<const NoteTrack>().empty();
}
}; return flag; } //gsw
using namespace MenuRegistry;
void OnExportMIDI(const CommandContext &context)
{
auto &project = context.project;
auto &tracks = TrackList::Get( project );
auto &window = GetProjectFrame( project );
// Make sure that there is
// exactly one NoteTrack selected.
const auto range = tracks.Selected<const NoteTrack>();
const auto numNoteTracksSelected = range.size();
if(numNoteTracksSelected > 1) {
AudacityMessageBox(
XO("Please select only one Note Track at a time.") );
return;
}
else if(numNoteTracksSelected < 1) {
AudacityMessageBox(
XO("Please select a Note Track.") );
return;
}
wxASSERT(numNoteTracksSelected);
if (!numNoteTracksSelected)
return;
const auto nt = *range.begin();
while(true) {
wxString fName;
fName = SelectFile(FileNames::Operation::Export,
XO("Export MIDI As:"),
wxEmptyString,
fName,
wxT("mid"),
{
{ XO("MIDI file"), { wxT("mid") }, true },
{ XO("Allegro file"), { wxT("gro") }, true },
},
wxFD_SAVE | wxFD_OVERWRITE_PROMPT | wxRESIZE_BORDER,
&window);
if (fName.empty())
return;
if(!fName.Contains(wxT("."))) {
fName = fName + wxT(".mid");
}
// Move existing files out of the way. Otherwise wxTextFile will
// append to (rather than replace) the current file.
if (wxFileExists(fName)) {
#ifdef __WXGTK__
wxString safetyFileName = fName + wxT("~");
#else
wxString safetyFileName = fName + wxT(".bak");
#endif
if (wxFileExists(safetyFileName))
wxRemoveFile(safetyFileName);
wxRename(fName, safetyFileName);
}
if(fName.EndsWith(wxT(".mid")) || fName.EndsWith(wxT(".midi"))) {
nt->ExportMIDI(fName);
} else if(fName.EndsWith(wxT(".gro"))) {
nt->ExportAllegro(fName);
} else {
auto msg = XO(
"You have selected a filename with an unrecognized file extension.\nDo you want to continue?");
auto title = XO("Export MIDI");
int id = AudacityMessageBox( msg, title, wxYES_NO );
if (id == wxNO) {
continue;
} else if (id == wxYES) {
nt->ExportMIDI(fName);
}
}
break;
}
}
AttachedItem sAttachment{
Command( wxT("ExportMIDI"), XXO("Export MI&DI..."), OnExportMIDI,
AudioIONotBusyFlag() | NoteTracksExistFlag() ),
{ wxT("File/Import-Export/ExportOther"),
{ OrderingHint::After, {"ExportLabels"} } }
};
}
#endif
|