diff --git a/app/src/main/java/com/lukas/music/song/Song.kt b/app/src/main/java/com/lukas/music/song/Song.kt index ebea238..9dd3cb8 100644 --- a/app/src/main/java/com/lukas/music/song/Song.kt +++ b/app/src/main/java/com/lukas/music/song/Song.kt @@ -9,7 +9,7 @@ import com.lukas.music.song.note.Note class Song( - private val root: Note, + var root: Note, val chordProgression: ChordProgression, val beats: Int ) { diff --git a/app/src/main/java/com/lukas/music/song/Song.kt b/app/src/main/java/com/lukas/music/song/Song.kt index ebea238..9dd3cb8 100644 --- a/app/src/main/java/com/lukas/music/song/Song.kt +++ b/app/src/main/java/com/lukas/music/song/Song.kt @@ -9,7 +9,7 @@ import com.lukas.music.song.note.Note class Song( - private val root: Note, + var root: Note, val chordProgression: ChordProgression, val beats: Int ) { diff --git a/app/src/main/java/com/lukas/music/song/chords/Chord.kt b/app/src/main/java/com/lukas/music/song/chords/Chord.kt index 9480a25..de1ba1b 100644 --- a/app/src/main/java/com/lukas/music/song/chords/Chord.kt +++ b/app/src/main/java/com/lukas/music/song/chords/Chord.kt @@ -8,6 +8,17 @@ } override fun toString(): String { - return "$note -> $chordType" + return "$note($chordType)" + } + + fun toString(displayChordNames: Boolean, root: Note): String { + if (displayChordNames) { + val noteName = (root + note).noteName + if (chordType == ChordType.Major) { + return noteName.toString().uppercase() + } + return noteName.toString().lowercase() + } + return toString() } } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/song/Song.kt b/app/src/main/java/com/lukas/music/song/Song.kt index ebea238..9dd3cb8 100644 --- a/app/src/main/java/com/lukas/music/song/Song.kt +++ b/app/src/main/java/com/lukas/music/song/Song.kt @@ -9,7 +9,7 @@ import com.lukas.music.song.note.Note class Song( - private val root: Note, + var root: Note, val chordProgression: ChordProgression, val beats: Int ) { diff --git a/app/src/main/java/com/lukas/music/song/chords/Chord.kt b/app/src/main/java/com/lukas/music/song/chords/Chord.kt index 9480a25..de1ba1b 100644 --- a/app/src/main/java/com/lukas/music/song/chords/Chord.kt +++ b/app/src/main/java/com/lukas/music/song/chords/Chord.kt @@ -8,6 +8,17 @@ } override fun toString(): String { - return "$note -> $chordType" + return "$note($chordType)" + } + + fun toString(displayChordNames: Boolean, root: Note): String { + if (displayChordNames) { + val noteName = (root + note).noteName + if (chordType == ChordType.Major) { + return noteName.toString().uppercase() + } + return noteName.toString().lowercase() + } + return toString() } } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/song/note/Note.kt b/app/src/main/java/com/lukas/music/song/note/Note.kt index cd3171f..dbeb453 100644 --- a/app/src/main/java/com/lukas/music/song/note/Note.kt +++ b/app/src/main/java/com/lukas/music/song/note/Note.kt @@ -3,7 +3,7 @@ import kotlin.math.pow class Note(private val id: Int) { - private val noteName = NoteName.VALUES[id % 12] + val noteName = NoteName.VALUES[id % 12] val octave = id / 12 - 1 val frequency = 440 * 2.0.pow((id - 69) / 12.0) diff --git a/app/src/main/java/com/lukas/music/song/Song.kt b/app/src/main/java/com/lukas/music/song/Song.kt index ebea238..9dd3cb8 100644 --- a/app/src/main/java/com/lukas/music/song/Song.kt +++ b/app/src/main/java/com/lukas/music/song/Song.kt @@ -9,7 +9,7 @@ import com.lukas.music.song.note.Note class Song( - private val root: Note, + var root: Note, val chordProgression: ChordProgression, val beats: Int ) { diff --git a/app/src/main/java/com/lukas/music/song/chords/Chord.kt b/app/src/main/java/com/lukas/music/song/chords/Chord.kt index 9480a25..de1ba1b 100644 --- a/app/src/main/java/com/lukas/music/song/chords/Chord.kt +++ b/app/src/main/java/com/lukas/music/song/chords/Chord.kt @@ -8,6 +8,17 @@ } override fun toString(): String { - return "$note -> $chordType" + return "$note($chordType)" + } + + fun toString(displayChordNames: Boolean, root: Note): String { + if (displayChordNames) { + val noteName = (root + note).noteName + if (chordType == ChordType.Major) { + return noteName.toString().uppercase() + } + return noteName.toString().lowercase() + } + return toString() } } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/song/note/Note.kt b/app/src/main/java/com/lukas/music/song/note/Note.kt index cd3171f..dbeb453 100644 --- a/app/src/main/java/com/lukas/music/song/note/Note.kt +++ b/app/src/main/java/com/lukas/music/song/note/Note.kt @@ -3,7 +3,7 @@ import kotlin.math.pow class Note(private val id: Int) { - private val noteName = NoteName.VALUES[id % 12] + val noteName = NoteName.VALUES[id % 12] val octave = id / 12 - 1 val frequency = 440 * 2.0.pow((id - 69) / 12.0) diff --git a/app/src/main/java/com/lukas/music/song/note/NoteName.kt b/app/src/main/java/com/lukas/music/song/note/NoteName.kt index 49c19b2..1137a42 100644 --- a/app/src/main/java/com/lukas/music/song/note/NoteName.kt +++ b/app/src/main/java/com/lukas/music/song/note/NoteName.kt @@ -26,6 +26,10 @@ return VALUES[resultPosition] } + override fun toString(): String { + return asString + } + companion object { val VALUES = values() } diff --git a/app/src/main/java/com/lukas/music/song/Song.kt b/app/src/main/java/com/lukas/music/song/Song.kt index ebea238..9dd3cb8 100644 --- a/app/src/main/java/com/lukas/music/song/Song.kt +++ b/app/src/main/java/com/lukas/music/song/Song.kt @@ -9,7 +9,7 @@ import com.lukas.music.song.note.Note class Song( - private val root: Note, + var root: Note, val chordProgression: ChordProgression, val beats: Int ) { diff --git a/app/src/main/java/com/lukas/music/song/chords/Chord.kt b/app/src/main/java/com/lukas/music/song/chords/Chord.kt index 9480a25..de1ba1b 100644 --- a/app/src/main/java/com/lukas/music/song/chords/Chord.kt +++ b/app/src/main/java/com/lukas/music/song/chords/Chord.kt @@ -8,6 +8,17 @@ } override fun toString(): String { - return "$note -> $chordType" + return "$note($chordType)" + } + + fun toString(displayChordNames: Boolean, root: Note): String { + if (displayChordNames) { + val noteName = (root + note).noteName + if (chordType == ChordType.Major) { + return noteName.toString().uppercase() + } + return noteName.toString().lowercase() + } + return toString() } } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/song/note/Note.kt b/app/src/main/java/com/lukas/music/song/note/Note.kt index cd3171f..dbeb453 100644 --- a/app/src/main/java/com/lukas/music/song/note/Note.kt +++ b/app/src/main/java/com/lukas/music/song/note/Note.kt @@ -3,7 +3,7 @@ import kotlin.math.pow class Note(private val id: Int) { - private val noteName = NoteName.VALUES[id % 12] + val noteName = NoteName.VALUES[id % 12] val octave = id / 12 - 1 val frequency = 440 * 2.0.pow((id - 69) / 12.0) diff --git a/app/src/main/java/com/lukas/music/song/note/NoteName.kt b/app/src/main/java/com/lukas/music/song/note/NoteName.kt index 49c19b2..1137a42 100644 --- a/app/src/main/java/com/lukas/music/song/note/NoteName.kt +++ b/app/src/main/java/com/lukas/music/song/note/NoteName.kt @@ -26,6 +26,10 @@ return VALUES[resultPosition] } + override fun toString(): String { + return asString + } + companion object { val VALUES = values() } diff --git a/app/src/main/java/com/lukas/music/ui/fragments/SongFragment.kt b/app/src/main/java/com/lukas/music/ui/fragments/SongFragment.kt index 859012b..14a88e4 100644 --- a/app/src/main/java/com/lukas/music/ui/fragments/SongFragment.kt +++ b/app/src/main/java/com/lukas/music/ui/fragments/SongFragment.kt @@ -4,6 +4,8 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter import android.widget.TableRow import android.widget.TextView import androidx.cardview.widget.CardView @@ -11,10 +13,13 @@ import androidx.fragment.app.Fragment import com.lukas.music.databinding.FragmentSongBinding import com.lukas.music.song.Song +import com.lukas.music.song.note.Note +import com.lukas.music.song.note.NoteName -class SongFragment : Fragment() { +class SongFragment : Fragment(), AdapterView.OnItemSelectedListener { private lateinit var binding: FragmentSongBinding + var displayChordNames = true override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -22,11 +27,24 @@ ): View? { binding = FragmentSongBinding.inflate(inflater) binding.chords.isStretchAllColumns = true - val layout = TableRow.LayoutParams( - TableRow.LayoutParams.MATCH_PARENT, - TableRow.LayoutParams.MATCH_PARENT + binding.literalChords.isChecked = true + binding.literalChords.setOnCheckedChangeListener { _, isChecked -> + displayChordNames = isChecked + updateChords() + } + val adapter = ArrayAdapter( + binding.root.context, + android.R.layout.simple_spinner_dropdown_item, NoteName.VALUES ) - layout.setMargins(10) + binding.keySelection.adapter = adapter + binding.keySelection.onItemSelectedListener = this + binding.keySelection.setSelection(Song.currentSong.root.noteName.index) + updateChords() + return binding.root + } + + private fun updateChords() { + binding.chords.removeAllViews() for (phrase in Song.currentSong.chordProgression.phrases) { val row = TableRow(binding.root.context) for (chord in phrase.chords) { @@ -34,13 +52,33 @@ card.radius = 10f card.layoutParams = layout val text = TextView(binding.root.context) - text.text = chord.toString() + text.text = chord.toString(displayChordNames, Song.currentSong.root) text.layoutParams = layout card.addView(text) row.addView(card) } binding.chords.addView(row) } - return binding.root + } + + companion object { + val layout = TableRow.LayoutParams( + TableRow.LayoutParams.MATCH_PARENT, + TableRow.LayoutParams.MATCH_PARENT + ) + + init { + layout.setMargins(10) + } + } + + override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { + Song.currentSong.root = Note.of(NoteName.VALUES[position], 4) + if (displayChordNames) { + updateChords() + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { } } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/song/Song.kt b/app/src/main/java/com/lukas/music/song/Song.kt index ebea238..9dd3cb8 100644 --- a/app/src/main/java/com/lukas/music/song/Song.kt +++ b/app/src/main/java/com/lukas/music/song/Song.kt @@ -9,7 +9,7 @@ import com.lukas.music.song.note.Note class Song( - private val root: Note, + var root: Note, val chordProgression: ChordProgression, val beats: Int ) { diff --git a/app/src/main/java/com/lukas/music/song/chords/Chord.kt b/app/src/main/java/com/lukas/music/song/chords/Chord.kt index 9480a25..de1ba1b 100644 --- a/app/src/main/java/com/lukas/music/song/chords/Chord.kt +++ b/app/src/main/java/com/lukas/music/song/chords/Chord.kt @@ -8,6 +8,17 @@ } override fun toString(): String { - return "$note -> $chordType" + return "$note($chordType)" + } + + fun toString(displayChordNames: Boolean, root: Note): String { + if (displayChordNames) { + val noteName = (root + note).noteName + if (chordType == ChordType.Major) { + return noteName.toString().uppercase() + } + return noteName.toString().lowercase() + } + return toString() } } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/song/note/Note.kt b/app/src/main/java/com/lukas/music/song/note/Note.kt index cd3171f..dbeb453 100644 --- a/app/src/main/java/com/lukas/music/song/note/Note.kt +++ b/app/src/main/java/com/lukas/music/song/note/Note.kt @@ -3,7 +3,7 @@ import kotlin.math.pow class Note(private val id: Int) { - private val noteName = NoteName.VALUES[id % 12] + val noteName = NoteName.VALUES[id % 12] val octave = id / 12 - 1 val frequency = 440 * 2.0.pow((id - 69) / 12.0) diff --git a/app/src/main/java/com/lukas/music/song/note/NoteName.kt b/app/src/main/java/com/lukas/music/song/note/NoteName.kt index 49c19b2..1137a42 100644 --- a/app/src/main/java/com/lukas/music/song/note/NoteName.kt +++ b/app/src/main/java/com/lukas/music/song/note/NoteName.kt @@ -26,6 +26,10 @@ return VALUES[resultPosition] } + override fun toString(): String { + return asString + } + companion object { val VALUES = values() } diff --git a/app/src/main/java/com/lukas/music/ui/fragments/SongFragment.kt b/app/src/main/java/com/lukas/music/ui/fragments/SongFragment.kt index 859012b..14a88e4 100644 --- a/app/src/main/java/com/lukas/music/ui/fragments/SongFragment.kt +++ b/app/src/main/java/com/lukas/music/ui/fragments/SongFragment.kt @@ -4,6 +4,8 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter import android.widget.TableRow import android.widget.TextView import androidx.cardview.widget.CardView @@ -11,10 +13,13 @@ import androidx.fragment.app.Fragment import com.lukas.music.databinding.FragmentSongBinding import com.lukas.music.song.Song +import com.lukas.music.song.note.Note +import com.lukas.music.song.note.NoteName -class SongFragment : Fragment() { +class SongFragment : Fragment(), AdapterView.OnItemSelectedListener { private lateinit var binding: FragmentSongBinding + var displayChordNames = true override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -22,11 +27,24 @@ ): View? { binding = FragmentSongBinding.inflate(inflater) binding.chords.isStretchAllColumns = true - val layout = TableRow.LayoutParams( - TableRow.LayoutParams.MATCH_PARENT, - TableRow.LayoutParams.MATCH_PARENT + binding.literalChords.isChecked = true + binding.literalChords.setOnCheckedChangeListener { _, isChecked -> + displayChordNames = isChecked + updateChords() + } + val adapter = ArrayAdapter( + binding.root.context, + android.R.layout.simple_spinner_dropdown_item, NoteName.VALUES ) - layout.setMargins(10) + binding.keySelection.adapter = adapter + binding.keySelection.onItemSelectedListener = this + binding.keySelection.setSelection(Song.currentSong.root.noteName.index) + updateChords() + return binding.root + } + + private fun updateChords() { + binding.chords.removeAllViews() for (phrase in Song.currentSong.chordProgression.phrases) { val row = TableRow(binding.root.context) for (chord in phrase.chords) { @@ -34,13 +52,33 @@ card.radius = 10f card.layoutParams = layout val text = TextView(binding.root.context) - text.text = chord.toString() + text.text = chord.toString(displayChordNames, Song.currentSong.root) text.layoutParams = layout card.addView(text) row.addView(card) } binding.chords.addView(row) } - return binding.root + } + + companion object { + val layout = TableRow.LayoutParams( + TableRow.LayoutParams.MATCH_PARENT, + TableRow.LayoutParams.MATCH_PARENT + ) + + init { + layout.setMargins(10) + } + } + + override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { + Song.currentSong.root = Note.of(NoteName.VALUES[position], 4) + if (displayChordNames) { + updateChords() + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_song.xml b/app/src/main/res/layout/fragment_song.xml index 864e035..a54563f 100644 --- a/app/src/main/res/layout/fragment_song.xml +++ b/app/src/main/res/layout/fragment_song.xml @@ -10,19 +10,46 @@ android:id="@+id/chords" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginTop="16dp" android:clipChildren="true" android:dividerPadding="5dp" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@+id/literalChords" /> + + + + \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/song/Song.kt b/app/src/main/java/com/lukas/music/song/Song.kt index ebea238..9dd3cb8 100644 --- a/app/src/main/java/com/lukas/music/song/Song.kt +++ b/app/src/main/java/com/lukas/music/song/Song.kt @@ -9,7 +9,7 @@ import com.lukas.music.song.note.Note class Song( - private val root: Note, + var root: Note, val chordProgression: ChordProgression, val beats: Int ) { diff --git a/app/src/main/java/com/lukas/music/song/chords/Chord.kt b/app/src/main/java/com/lukas/music/song/chords/Chord.kt index 9480a25..de1ba1b 100644 --- a/app/src/main/java/com/lukas/music/song/chords/Chord.kt +++ b/app/src/main/java/com/lukas/music/song/chords/Chord.kt @@ -8,6 +8,17 @@ } override fun toString(): String { - return "$note -> $chordType" + return "$note($chordType)" + } + + fun toString(displayChordNames: Boolean, root: Note): String { + if (displayChordNames) { + val noteName = (root + note).noteName + if (chordType == ChordType.Major) { + return noteName.toString().uppercase() + } + return noteName.toString().lowercase() + } + return toString() } } \ No newline at end of file diff --git a/app/src/main/java/com/lukas/music/song/note/Note.kt b/app/src/main/java/com/lukas/music/song/note/Note.kt index cd3171f..dbeb453 100644 --- a/app/src/main/java/com/lukas/music/song/note/Note.kt +++ b/app/src/main/java/com/lukas/music/song/note/Note.kt @@ -3,7 +3,7 @@ import kotlin.math.pow class Note(private val id: Int) { - private val noteName = NoteName.VALUES[id % 12] + val noteName = NoteName.VALUES[id % 12] val octave = id / 12 - 1 val frequency = 440 * 2.0.pow((id - 69) / 12.0) diff --git a/app/src/main/java/com/lukas/music/song/note/NoteName.kt b/app/src/main/java/com/lukas/music/song/note/NoteName.kt index 49c19b2..1137a42 100644 --- a/app/src/main/java/com/lukas/music/song/note/NoteName.kt +++ b/app/src/main/java/com/lukas/music/song/note/NoteName.kt @@ -26,6 +26,10 @@ return VALUES[resultPosition] } + override fun toString(): String { + return asString + } + companion object { val VALUES = values() } diff --git a/app/src/main/java/com/lukas/music/ui/fragments/SongFragment.kt b/app/src/main/java/com/lukas/music/ui/fragments/SongFragment.kt index 859012b..14a88e4 100644 --- a/app/src/main/java/com/lukas/music/ui/fragments/SongFragment.kt +++ b/app/src/main/java/com/lukas/music/ui/fragments/SongFragment.kt @@ -4,6 +4,8 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter import android.widget.TableRow import android.widget.TextView import androidx.cardview.widget.CardView @@ -11,10 +13,13 @@ import androidx.fragment.app.Fragment import com.lukas.music.databinding.FragmentSongBinding import com.lukas.music.song.Song +import com.lukas.music.song.note.Note +import com.lukas.music.song.note.NoteName -class SongFragment : Fragment() { +class SongFragment : Fragment(), AdapterView.OnItemSelectedListener { private lateinit var binding: FragmentSongBinding + var displayChordNames = true override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -22,11 +27,24 @@ ): View? { binding = FragmentSongBinding.inflate(inflater) binding.chords.isStretchAllColumns = true - val layout = TableRow.LayoutParams( - TableRow.LayoutParams.MATCH_PARENT, - TableRow.LayoutParams.MATCH_PARENT + binding.literalChords.isChecked = true + binding.literalChords.setOnCheckedChangeListener { _, isChecked -> + displayChordNames = isChecked + updateChords() + } + val adapter = ArrayAdapter( + binding.root.context, + android.R.layout.simple_spinner_dropdown_item, NoteName.VALUES ) - layout.setMargins(10) + binding.keySelection.adapter = adapter + binding.keySelection.onItemSelectedListener = this + binding.keySelection.setSelection(Song.currentSong.root.noteName.index) + updateChords() + return binding.root + } + + private fun updateChords() { + binding.chords.removeAllViews() for (phrase in Song.currentSong.chordProgression.phrases) { val row = TableRow(binding.root.context) for (chord in phrase.chords) { @@ -34,13 +52,33 @@ card.radius = 10f card.layoutParams = layout val text = TextView(binding.root.context) - text.text = chord.toString() + text.text = chord.toString(displayChordNames, Song.currentSong.root) text.layoutParams = layout card.addView(text) row.addView(card) } binding.chords.addView(row) } - return binding.root + } + + companion object { + val layout = TableRow.LayoutParams( + TableRow.LayoutParams.MATCH_PARENT, + TableRow.LayoutParams.MATCH_PARENT + ) + + init { + layout.setMargins(10) + } + } + + override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { + Song.currentSong.root = Note.of(NoteName.VALUES[position], 4) + if (displayChordNames) { + updateChords() + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_song.xml b/app/src/main/res/layout/fragment_song.xml index 864e035..a54563f 100644 --- a/app/src/main/res/layout/fragment_song.xml +++ b/app/src/main/res/layout/fragment_song.xml @@ -10,19 +10,46 @@ android:id="@+id/chords" android:layout_width="0dp" android:layout_height="wrap_content" + android:layout_marginTop="16dp" android:clipChildren="true" android:dividerPadding="5dp" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@+id/literalChords" /> + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6e8239a..a200009 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,4 +10,7 @@ active select the instrument waveform edit this instrument\'s properties + Add a new phrase + Actual chords + select the song\'s key \ No newline at end of file