Initial commit: InTono — app KMP per l'apprendimento musicale

App Kotlin Multiplatform (Android/iOS/Desktop) con Compose Multiplatform:
controllo intonazione (YIN), pratica guidata, metronomo, ear training,
sfide, scansione spartiti via AI, spartiti bundled e pentagramma con
glifi tipografici, travature, battute e spaziatura proporzionale.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
lucianoandClaude Fable 5 committed 2026-07-22 10:06:59 +02:00
commit 21ad969b10
245 files changed
+28963

No files matched your search

+26
View File
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.NoteMusicali">
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.NoteMusicali">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
@@ -0,0 +1,61 @@
package com.notemusicali
import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.material3.Surface
import androidx.compose.material3.MaterialTheme
import androidx.compose.ui.Modifier
import androidx.core.content.ContextCompat
import com.notemusicali.navigation.AppNavigation
import com.notemusicali.scores.ScoreProviderContext
import com.notemusicali.scan.AppSettings
import com.notemusicali.ui.theme.NoteMusicaliTheme
import com.notemusicali.util.CrashHandler
class MainActivity : ComponentActivity() {
private val requestPermissionLauncher = registerForActivityResult(
ActivityResultContracts.RequestPermission()
) { _ -> }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
CrashHandler.install()
AppSettings.migrateIfNeeded()
enableEdgeToEdge()
ScoreProviderContext.init(this, getExternalFilesDir(null))
val permissionsToRequest = mutableListOf<String>()
if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
!= PackageManager.PERMISSION_GRANTED
) {
permissionsToRequest.add(Manifest.permission.RECORD_AUDIO)
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED
) {
permissionsToRequest.add(Manifest.permission.CAMERA)
}
permissionsToRequest.forEach { requestPermissionLauncher.launch(it) }
setContent {
NoteMusicaliTheme {
Surface(
modifier = Modifier
.fillMaxSize()
.systemBarsPadding(),
color = MaterialTheme.colorScheme.background,
) {
AppNavigation()
}
}
}
}
}
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:type="radial"
android:centerX="0.5"
android:centerY="0.5"
android:gradientRadius="60%p"
android:startColor="#2D1B69"
android:endColor="#0A0118" />
</shape>
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<!-- Subtle glow behind note -->
<path
android:fillColor="#33FFD700"
android:pathData="M54,54 m-22,0 a22,22 0,1 1,44 0 a22,22 0,1 1,-44 0" />
<!-- Decorative ring -->
<path
android:strokeColor="#22FFD700"
android:strokeWidth="0.5"
android:fillColor="#00000000"
android:pathData="M54,54 m-28,0 a28,28 0,1 1,56 0 a28,28 0,1 1,-56 0" />
<!-- Eighth note - gold -->
<path
android:fillColor="#FFD700"
android:pathData="M52,34 L52,68 C51.5,67.2 50.5,66.6 49,66.4 C45.5,65.8 42,67.5 41.5,70.2 C41,72.9 43.5,75.2 47,75.8 C50.5,76.4 53.5,74.8 54,72.2 L54,72 L54,46 L66,42 L66,38 Z" />
<!-- Flag -->
<path
android:fillColor="#FFD700"
android:pathData="M54,34 C58,36 62,40 60,46 L54,42 Z" />
</vector>
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">InTono</string>
</resources>
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.NoteMusicali" parent="android:Theme.Material.Light.NoActionBar" />
</resources>