/*
* Catroid: An on-device visual programming system for Android devices
* Copyright (C) 2010-2016 The Catrobat Team
* (<http://developer.catrobat.org/credits>)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* An additional term exception under section 7 of the GNU Affero
* General Public License, version 3, is available at
* http://developer.catrobat.org/license_additional_term
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.catrobat.catroid.pocketmusic;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.ViewGroup;
import org.catrobat.catroid.ProjectManager;
import org.catrobat.catroid.R;
import org.catrobat.catroid.common.SoundInfo;
import org.catrobat.catroid.pocketmusic.note.MusicalBeat;
import org.catrobat.catroid.pocketmusic.note.MusicalInstrument;
import org.catrobat.catroid.pocketmusic.note.MusicalKey;
import org.catrobat.catroid.pocketmusic.note.Project;
import org.catrobat.catroid.pocketmusic.note.Track;
import org.catrobat.catroid.pocketmusic.note.midi.MidiException;
import org.catrobat.catroid.pocketmusic.note.midi.MidiToProjectConverter;
import org.catrobat.catroid.pocketmusic.note.midi.ProjectToMidiConverter;
import org.catrobat.catroid.pocketmusic.note.trackgrid.TrackGridToTrackConverter;
import org.catrobat.catroid.pocketmusic.ui.TrackView;
import org.catrobat.catroid.ui.BaseActivity;
import org.catrobat.catroid.utils.Utils;
import java.io.File;
import java.io.IOException;
import java.util.Random;
public class PocketMusicActivity extends BaseActivity {
private static final String TAG = PocketMusicActivity.class.getSimpleName();
private Project project;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String fileName = getIntent().getStringExtra("FILENAME");
String title = getIntent().getStringExtra("TITLE");
if (null != fileName) {
MidiToProjectConverter converter = new MidiToProjectConverter();
try {
SoundInfo soundInfo = new SoundInfo();
soundInfo.setSoundFileName(fileName);
project = converter.convertMidiFileToProject(new File(soundInfo.getAbsolutePath()));
project.setFileName(fileName);
project.setName(title);
} catch (MidiException | IOException ignored) {
}
}
if (project == null) {
project = createEmptyProject();
}
setContentView(R.layout.activity_pocketmusic);
ViewGroup content = (ViewGroup) findViewById(android.R.id.content);
TrackView trackView = (TrackView) findViewById(R.id.musicdroid_note_grid);
trackView.setTrack(project.getTrack("Track 1"), project.getBeatsPerMinute());
new ScrollController(content, project.getBeatsPerMinute());
}
public SoundInfo getSoundInfoForTrack(boolean fileExists) {
SoundInfo soundInfo = new SoundInfo();
if (fileExists) {
soundInfo.setTitle(project.getName());
soundInfo.setSoundFileName(project.getFileName());
} else {
soundInfo.setTitle(getString(R.string.pocketmusic_recorded_filename));
Random randomGenerator = new Random();
soundInfo.setSoundFileName("MUS-" + Math.abs(randomGenerator.nextInt()) + ".midi");
}
return soundInfo;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public void finish() {
if (null != project) {
boolean fileExists = project.getFileName() != null;
TrackView tv = (TrackView) findViewById(R.id.musicdroid_note_grid);
Track track = TrackGridToTrackConverter.convertTrackGridToTrack(tv.getTrackGrid(), Project.DEFAULT_BEATS_PER_MINUTE);
if (track.isEmpty() && fileExists) {
new File(project.getFileName()).delete();
SoundInfo soundInfo = getSoundInfoForTrack(true);
ProjectManager.getInstance().getCurrentSprite().getSoundList().remove(soundInfo);
} else if (!track.isEmpty()) {
for (String trackName : project.getTrackNames()) {
project.putTrack(trackName, track);
}
SoundInfo soundInfo = getSoundInfoForTrack(fileExists);
ProjectToMidiConverter projectToMidiConverter = new ProjectToMidiConverter();
File initialFile = new File(soundInfo.getAbsolutePath());
try {
projectToMidiConverter.writeProjectAsMidi(project, initialFile);
} catch (IOException | MidiException e) {
Log.e(TAG, "Couldn't save midi file (" + soundInfo.getSoundFileName() + ").", e);
}
if (!fileExists) {
soundInfo.setSoundFileName(Utils.md5Checksum(soundInfo.getAbsolutePath()) + "_" + soundInfo.getSoundFileName());
File rename = new File(soundInfo.getAbsolutePath());
initialFile.renameTo(rename);
ProjectManager.getInstance().getCurrentSprite().getSoundList().add(soundInfo);
}
}
}
super.finish();
}
private Project createEmptyProject() {
int bpm = 60;
Project project = new Project("Untitled song", MusicalBeat.BEAT_4_4, bpm);
Track track = new Track(MusicalKey.VIOLIN, MusicalInstrument.VIOLIN);
project.putTrack("Track 1", track);
return project;
}
}