diff --git a/app/src/main/java/com/lukas/music/instruments/Instrument.kt b/app/src/main/java/com/lukas/music/instruments/Instrument.kt index 46957ee..cee1052 100644 --- a/app/src/main/java/com/lukas/music/instruments/Instrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/Instrument.kt @@ -33,6 +33,7 @@ abstract fun destroy() abstract fun updateEnvelope() abstract fun updateEffects() + abstract fun isPlaying(note: Note): Boolean companion object { val instruments = mutableListOf() diff --git a/app/src/main/java/com/lukas/music/instruments/Instrument.kt b/app/src/main/java/com/lukas/music/instruments/Instrument.kt index 46957ee..cee1052 100644 --- a/app/src/main/java/com/lukas/music/instruments/Instrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/Instrument.kt @@ -33,6 +33,7 @@ abstract fun destroy() abstract fun updateEnvelope() abstract fun updateEffects() + abstract fun isPlaying(note: Note): Boolean companion object { val instruments = mutableListOf() diff --git a/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt b/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt index 3526e60..e631548 100644 --- a/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt @@ -34,9 +34,6 @@ } override fun startNote(note: Note) { - if (note == internalInstrument.note) { - return - } internalInstrument.startNote(note) } @@ -63,4 +60,6 @@ internalInstrument.applyEffectAttributes(effect) } } + + override fun isPlaying(note: Note): Boolean = internalInstrument.note == note } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/instruments/Instrument.kt b/app/src/main/java/com/lukas/music/instruments/Instrument.kt index 46957ee..cee1052 100644 --- a/app/src/main/java/com/lukas/music/instruments/Instrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/Instrument.kt @@ -33,6 +33,7 @@ abstract fun destroy() abstract fun updateEnvelope() abstract fun updateEffects() + abstract fun isPlaying(note: Note): Boolean companion object { val instruments = mutableListOf() diff --git a/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt b/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt index 3526e60..e631548 100644 --- a/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt @@ -34,9 +34,6 @@ } override fun startNote(note: Note) { - if (note == internalInstrument.note) { - return - } internalInstrument.startNote(note) } @@ -63,4 +60,6 @@ internalInstrument.applyEffectAttributes(effect) } } + + override fun isPlaying(note: Note): Boolean = internalInstrument.note == note } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt b/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt index 70ba98a..7beb64c 100644 --- a/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt @@ -48,10 +48,11 @@ return } if (internalInstruments[index].note == note) { + internalInstruments[index].startNote(note) return } } - throw IllegalStateException("cannot start another note with the current amount of oscillators") + println("cannot start another note with the current amount of oscillators") } override fun stop() { @@ -89,4 +90,13 @@ } } } + + override fun isPlaying(note: Note): Boolean { + for (instrument in internalInstruments) { + if (instrument.note == note) { + return true + } + } + return false + } } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/instruments/Instrument.kt b/app/src/main/java/com/lukas/music/instruments/Instrument.kt index 46957ee..cee1052 100644 --- a/app/src/main/java/com/lukas/music/instruments/Instrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/Instrument.kt @@ -33,6 +33,7 @@ abstract fun destroy() abstract fun updateEnvelope() abstract fun updateEffects() + abstract fun isPlaying(note: Note): Boolean companion object { val instruments = mutableListOf() diff --git a/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt b/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt index 3526e60..e631548 100644 --- a/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt @@ -34,9 +34,6 @@ } override fun startNote(note: Note) { - if (note == internalInstrument.note) { - return - } internalInstrument.startNote(note) } @@ -63,4 +60,6 @@ internalInstrument.applyEffectAttributes(effect) } } + + override fun isPlaying(note: Note): Boolean = internalInstrument.note == note } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt b/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt index 70ba98a..7beb64c 100644 --- a/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt @@ -48,10 +48,11 @@ return } if (internalInstruments[index].note == note) { + internalInstruments[index].startNote(note) return } } - throw IllegalStateException("cannot start another note with the current amount of oscillators") + println("cannot start another note with the current amount of oscillators") } override fun stop() { @@ -89,4 +90,13 @@ } } } + + override fun isPlaying(note: Note): Boolean { + for (instrument in internalInstruments) { + if (instrument.note == note) { + return true + } + } + return false + } } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/song/voice/Voice.kt b/app/src/main/java/com/lukas/music/song/voice/Voice.kt index 54cfe7a..aae1c2a 100644 --- a/app/src/main/java/com/lukas/music/song/voice/Voice.kt +++ b/app/src/main/java/com/lukas/music/song/voice/Voice.kt @@ -19,7 +19,7 @@ abstract val noteCount: Int val noteActive: Array> = Array(Song.currentSong.beats * Song.currentSong.subBeats) { Array(noteCount) { false } } - var repeatNote = true // TODO + var restrikeNotes = false abstract fun getNotes(root: Note, chordNotes: Array): Array @@ -36,7 +36,9 @@ instrument.stopNote(note) continue } - instrument.startNote(note) + if (restrikeNotes || !instrument.isPlaying(note)) { + instrument.startNote(note) + } } } diff --git a/app/src/main/java/com/lukas/music/instruments/Instrument.kt b/app/src/main/java/com/lukas/music/instruments/Instrument.kt index 46957ee..cee1052 100644 --- a/app/src/main/java/com/lukas/music/instruments/Instrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/Instrument.kt @@ -33,6 +33,7 @@ abstract fun destroy() abstract fun updateEnvelope() abstract fun updateEffects() + abstract fun isPlaying(note: Note): Boolean companion object { val instruments = mutableListOf() diff --git a/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt b/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt index 3526e60..e631548 100644 --- a/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt @@ -34,9 +34,6 @@ } override fun startNote(note: Note) { - if (note == internalInstrument.note) { - return - } internalInstrument.startNote(note) } @@ -63,4 +60,6 @@ internalInstrument.applyEffectAttributes(effect) } } + + override fun isPlaying(note: Note): Boolean = internalInstrument.note == note } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt b/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt index 70ba98a..7beb64c 100644 --- a/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt @@ -48,10 +48,11 @@ return } if (internalInstruments[index].note == note) { + internalInstruments[index].startNote(note) return } } - throw IllegalStateException("cannot start another note with the current amount of oscillators") + println("cannot start another note with the current amount of oscillators") } override fun stop() { @@ -89,4 +90,13 @@ } } } + + override fun isPlaying(note: Note): Boolean { + for (instrument in internalInstruments) { + if (instrument.note == note) { + return true + } + } + return false + } } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/song/voice/Voice.kt b/app/src/main/java/com/lukas/music/song/voice/Voice.kt index 54cfe7a..aae1c2a 100644 --- a/app/src/main/java/com/lukas/music/song/voice/Voice.kt +++ b/app/src/main/java/com/lukas/music/song/voice/Voice.kt @@ -19,7 +19,7 @@ abstract val noteCount: Int val noteActive: Array> = Array(Song.currentSong.beats * Song.currentSong.subBeats) { Array(noteCount) { false } } - var repeatNote = true // TODO + var restrikeNotes = false abstract fun getNotes(root: Note, chordNotes: Array): Array @@ -36,7 +36,9 @@ instrument.stopNote(note) continue } - instrument.startNote(note) + if (restrikeNotes || !instrument.isPlaying(note)) { + instrument.startNote(note) + } } } diff --git a/app/src/main/java/com/lukas/music/ui/fragments/EditVoiceFragment.kt b/app/src/main/java/com/lukas/music/ui/fragments/EditVoiceFragment.kt index 0033b59..5bd49b6 100644 --- a/app/src/main/java/com/lukas/music/ui/fragments/EditVoiceFragment.kt +++ b/app/src/main/java/com/lukas/music/ui/fragments/EditVoiceFragment.kt @@ -31,6 +31,7 @@ savedInstanceState: Bundle? ): View? { binding = FragmentEditVoiceBinding.inflate(inflater) + binding.restrikeButton.setupToggle(voice::restrikeNotes, R.color.green) for (row in voice.noteCount - 1 downTo 0) { val rowLayout = TableRow(binding.root.context) for (column in 0 until Song.currentSong.beats * Song.currentSong.subBeats) { diff --git a/app/src/main/java/com/lukas/music/instruments/Instrument.kt b/app/src/main/java/com/lukas/music/instruments/Instrument.kt index 46957ee..cee1052 100644 --- a/app/src/main/java/com/lukas/music/instruments/Instrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/Instrument.kt @@ -33,6 +33,7 @@ abstract fun destroy() abstract fun updateEnvelope() abstract fun updateEffects() + abstract fun isPlaying(note: Note): Boolean companion object { val instruments = mutableListOf() diff --git a/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt b/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt index 3526e60..e631548 100644 --- a/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/MonoInstrument.kt @@ -34,9 +34,6 @@ } override fun startNote(note: Note) { - if (note == internalInstrument.note) { - return - } internalInstrument.startNote(note) } @@ -63,4 +60,6 @@ internalInstrument.applyEffectAttributes(effect) } } + + override fun isPlaying(note: Note): Boolean = internalInstrument.note == note } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt b/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt index 70ba98a..7beb64c 100644 --- a/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt +++ b/app/src/main/java/com/lukas/music/instruments/PolyInstrument.kt @@ -48,10 +48,11 @@ return } if (internalInstruments[index].note == note) { + internalInstruments[index].startNote(note) return } } - throw IllegalStateException("cannot start another note with the current amount of oscillators") + println("cannot start another note with the current amount of oscillators") } override fun stop() { @@ -89,4 +90,13 @@ } } } + + override fun isPlaying(note: Note): Boolean { + for (instrument in internalInstruments) { + if (instrument.note == note) { + return true + } + } + return false + } } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/song/voice/Voice.kt b/app/src/main/java/com/lukas/music/song/voice/Voice.kt index 54cfe7a..aae1c2a 100644 --- a/app/src/main/java/com/lukas/music/song/voice/Voice.kt +++ b/app/src/main/java/com/lukas/music/song/voice/Voice.kt @@ -19,7 +19,7 @@ abstract val noteCount: Int val noteActive: Array> = Array(Song.currentSong.beats * Song.currentSong.subBeats) { Array(noteCount) { false } } - var repeatNote = true // TODO + var restrikeNotes = false abstract fun getNotes(root: Note, chordNotes: Array): Array @@ -36,7 +36,9 @@ instrument.stopNote(note) continue } - instrument.startNote(note) + if (restrikeNotes || !instrument.isPlaying(note)) { + instrument.startNote(note) + } } } diff --git a/app/src/main/java/com/lukas/music/ui/fragments/EditVoiceFragment.kt b/app/src/main/java/com/lukas/music/ui/fragments/EditVoiceFragment.kt index 0033b59..5bd49b6 100644 --- a/app/src/main/java/com/lukas/music/ui/fragments/EditVoiceFragment.kt +++ b/app/src/main/java/com/lukas/music/ui/fragments/EditVoiceFragment.kt @@ -31,6 +31,7 @@ savedInstanceState: Bundle? ): View? { binding = FragmentEditVoiceBinding.inflate(inflater) + binding.restrikeButton.setupToggle(voice::restrikeNotes, R.color.green) for (row in voice.noteCount - 1 downTo 0) { val rowLayout = TableRow(binding.root.context) for (column in 0 until Song.currentSong.beats * Song.currentSong.subBeats) { diff --git a/app/src/main/res/layout/fragment_edit_voice.xml b/app/src/main/res/layout/fragment_edit_voice.xml index d9f8eaf..a734c83 100644 --- a/app/src/main/res/layout/fragment_edit_voice.xml +++ b/app/src/main/res/layout/fragment_edit_voice.xml @@ -21,14 +21,12 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" - android:layout_marginTop="16dp" - android:layout_marginEnd="16dp" android:text="@string/edit_voice" android:textAlignment="center" android:textSize="20sp" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintBottom_toBottomOf="@+id/restrikeButton" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toTopOf="@+id/restrikeButton" /> + app:layout_constraintTop_toBottomOf="@+id/restrikeButton" /> +