Italian creare una sound board

fifiddu70

Well-Known Member
Licensed User
Longtime User
Ciao a tutti, come da titolo vorrei creare una sound board, praticamente sono 10 pulsanti con la possibilità tramite un'altro pulsante di caricare un file audio mp3 o vaw e di farlo suonare con l'altro pulsante, possibilmente una label mi indica anche il nome del file, non riesco al momento a ricordare come fare, quindi l'utente potrà navigare tra i suoi file audio sparsi nel telefono e caricarli, spero sia stao chiaro nel mio intento di realizzarla.
 

LucaMs

Expert
Licensed User
Longtime User
spero sia stao chiaro nel mio intento di realizzarla
Oddio, non sei mai chiarissimo nella spiegazione ? , ma forse ho capito cosa intendi.

Vuoi 10 tasti cui associare un file audio ciascuno ed altri due il cui scopo è: uno per scegliere il file da associare a ciascuno dei 10 e un altro per lanciare l'esecuzione (play) del file.

Se fosse così, io farei in modo diverso. 10 panel, anziché tasti. Long Click apre una dialog per scegliere il file da associare a quello stesso panel, Click semplice per mandare in esecuzione il file. Sui panel, una label col nome del brano.

Per selezionare il file audio, usa ContentChooser, poi associa l'url del file al panel (scrivilo nel tag) e salva le associazioni in una Map o KeyValueStore2
[Se, invece, ti riferisci a B4J - dovresti specificarlo, nelle domande nel forum italiano - usa FileChooser)

P.S. Per "suonare i file", MediaPlayer.
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Ho sprecato una risposta:
https://www.b4x.com/android/forum/t...oard-for-loaded-sound-from-smartphone.146441/
?
 

LucaMs

Expert
Licensed User
Longtime User
No, semplicemente cercavo un aiutino sul codice essendo 2 pulsanti ed una labelView attachment 139803
Non mi pare che la risposta che hai ottenuto "là" sia stata nettamente migliore della mia, anzi ?

Se vuoi ti butto giù un sorgentino (B4A, vero?). Ovviamente, dato che mi ritengo offeso ?, non gratuitamente, ma cmq per un amico italiano, cifra modica: 500€ anziché 400€ ?
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
pensavo di più, sei veramente un amico !!
 

LucaMs

Expert
Licensed User
Longtime User
La scorsa notte (!) ho provato, proprio usando il ContentChooser che ti ho suggerito io e adesso Erel (il thread [B4X] TextEditor).
Puoi vedere che mi dà un problema.
Ti farò sapere.
Ok, grazie al suggerimento di @DonManfred, problema risolto.

Mancano ancora un paio di cosucce (salvataggio associazione file-tasto), che farò tra un po', non so di preciso quando ma entro qualche ora, di sicuro.
 

LucaMs

Expert
Licensed User
Longtime User
Ok, grazie al suggerimento di @DonManfred, problema risolto.

Mancano ancora un paio di cosucce (salvataggio associazione file-tasto), che farò tra un po', non so di preciso quando ma entro qualche ora, di sicuro.
"Mancano ancora un paio di cosucce" un par de <omissis> ?

La cosa è più complicata del previsto.
Facendo selezionare il file audio usando la classe di Erel e mandandolo in esecuzione col MediaPlayer, funziona.
Una volta salvata la directory ed il nome del file audio, recuperandole e tentando di eseguire di nuovo il Play del MediaPlayer... crash, manca un permesso.

Ho cercato e trovato solo una domanda molto simile a cui nessuno ha risposto.

Sono costretto ad aprire io stesso un thread per porre la questione.


[Nota: il tutto mi sta impegnando ore, per cui il prezzo sale a 1.000€ - per adesso ?]
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
non capisco una cosa che per scegliere un file e metterlo in play bisogna usare centinaia di righe di codice fatte da pagine...bho!!!
io avevi pensato a qualcosa del genere ma forse non può mai funzionare così?
start:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
    #BridgeLogger: True
   
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim mp1 As MediaPlayer
    Private CC As ContentChooser
End Sub

Sub Globals
    Private btnchoose As Button
    Private btnplayfile As Button
    Private lblinfoname As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout")
    CC.Initialize("CC")
    mp1.Initialize
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub


Private Sub btnchoose_Click
   
    CC.Show("*/*", "Scegli File da inviare")
End Sub

Private Sub btnplayfile_Click
   
End Sub


Sub CC_Result (Success As Boolean, Dir As String, FileName As String)
    If Success Then
        Dim normalizedFile As String = GetPathFromContentResult(FileName)
       
        If File.Exists("", normalizedFile) == False Then
           
            ToastMessageShow("File non accessibile.", True)
            Return
           
        End If
        CallSubDelayed3(FileTranser, "SendFile", "", normalizedFile)
    Else
        If LastException.IsInitialized Then ToastMessageShow(LastException.Message, True)
    End If
   
End Sub

'this code tries to retrieve the real file from the uri
Sub GetPathFromContentResult(UriString As String) As String
    If UriString.StartsWith("/") Then Return UriString 'If the user used a file manager to choose the image
    Dim Proj() As String
    Proj = Array As String("_data")
    Dim Cursor As Cursor
    Dim r As Reflector
    Dim Uri As Object
    Uri = r.RunStaticMethod("android.net.Uri", "parse", _
        Array As Object(UriString), _
        Array As String("java.lang.String"))
    r.Target = r.GetContext
    r.Target = r.RunMethod("getContentResolver")
    Cursor = r.RunMethod4("query", _
    Array As Object(Uri, Proj, Null, Null, Null), _
    Array As String("android.net.Uri", _
        "[Ljava.lang.String;", "java.lang.String", _
        "[Ljava.lang.String;", "java.lang.String"))
   
    Cursor.Position = 0
    Dim res As String
    res = Cursor.GetString("_data")
    Cursor.Close
    Return res
   
End Sub
come faccio a far suonare il file audio appena selezionato?
ma scusa se ti invito questa estate a partanna a gustare una bella pizza su una piazza con veduta sulle isole egadi al tramonto non e meglio di 1000 euro?
 

LucaMs

Expert
Licensed User
Longtime User
non capisco una cosa che per scegliere un file e metterlo in play bisogna usare centinaia di righe di codice fatte da pagine...bho!!!
io avevi pensato a qualcosa del genere ma forse non può mai funzionare così?
Non funziona per qualunque tipo di "indirizzo" ("luogo" da cui venga selezionato il file audio) e non è garantito (il percorso) sulle versioni Android più recenti.


ma scusa se ti invito questa estate a partanna a gustare una bella pizza su una piazza con veduta sulle isole egadi al tramonto non e meglio di 1000 euro?
Se dietro il tuo nick name ed avatar in realtà si nasconde Juliana Moreira... sì ?
 

Sagenut

Expert
Licensed User
Longtime User
non capisco una cosa che per scegliere un file e metterlo in play bisogna usare centinaia di righe di codice fatte da pagine...bho!!!
Perché Google ci vuole bene e ogni anno complica le cose in nome della sicurezza dei nostri dati.
 

LucaMs

Expert
Licensed User
Longtime User
Io la vedo più così:



L'utente fa un LongClick su un panel, gli viene consentito selezionare un file audio (da "dovunque") e viene subito "suonato".
Quando l'app viene messa in pausa o chiusa, tutte le associazioni Panel-FileAudio vengono salvate.
Al riavvio, vengono ricaricate e basta un Click semplice per "suonare il file".
Nell'etichetta (bianca, nell'immagine) si può scrivere il nome del file o dare all'utente la possibilità di scriverne uno.

Con i due tasti come intendi tu, uno per la selezione e uno per il playing, dovresti comunque dare la possibilità all'utente di selezionare a quale pannello associare il file.

Funziona già; c'è quel problema, che è comunque importante, anche in assoluto, non solo per questa app. Speriamo che Erel scriva la soluzione.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Ragazzi ci sono riuscito a farla funzionare in questa maniera, posto il codice completo.
B4X:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
    #BridgeLogger: True
   
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim mp1 As MediaPlayer
    Private CC As ContentChooser
   
End Sub

Sub Globals
    Private btnchoose As Button
    Private btnplayfile As Button
    Private lblinfoname As Label
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout")
    CC.Initialize("CC")
    mp1.Initialize
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub


Private Sub btnchoose_Click
    CC.Show("*/*", "Scegli File da inviare")
End Sub

Private Sub btnplayfile_Click
   
End Sub


Sub CC_Result (Success As Boolean, Dir As String, FileName As String)
    If Success Then
        Log("filename: "&FileName)

        Dim normalizedFile As String = GetPathFromContentResult(FileName)
        Log("normalize : "&normalizedFile)
        '        CallSubDelayed3(FileTranser, "SendFile",Dir,normalizedFile)
           mp1.Load(Dir,FileName)
           mp1.Play
    Else
        If LastException.IsInitialized Then ToastMessageShow(LastException.Message, True)
    End If
End Sub



Sub GetPathFromContentResult(UriString As String) As String
    If UriString.StartsWith("/") Then Return UriString 'If the user used a file manager to choose the image
    Dim Proj() As String
    Proj = Array As String("_data")
    Dim Cursor As Cursor
    Dim r As Reflector
    Dim Uri As Object
    Uri = r.RunStaticMethod("android.net.Uri", "parse", _
      Array As Object(UriString), _
      Array As String("java.lang.String"))
    r.Target = r.GetContext
    r.Target = r.RunMethod("getContentResolver")
    Cursor = r.RunMethod4("query", _
   Array As Object(Uri, Proj, Null, Null, Null), _
   Array As String("android.net.Uri", _
      "[Ljava.lang.String;", "java.lang.String", _
      "[Ljava.lang.String;", "java.lang.String"))
    Cursor.Position = 0
    Dim res As String
    res = Cursor.GetString("_data")
    Cursor.Close
    Return res
End Sub
ovviamente come vedete da codice funziona in autoplay, il pulsante play non lo ancora attivato.
mi manca da far vislualizzare alla label il nome del file ma secondo me sarebbe meglio personalizzabile con una edittext che ne pensate?
 

Sagenut

Expert
Licensed User
Longtime User
mi manca da far vislualizzare alla label il nome del file ma secondo me sarebbe meglio personalizzabile con una edittext che ne pensate?
Sicuramente meglio.
Il nome del file potrebbe anche essere insensato, meglio per scrivere quel che si vuole poter sapere cosa è.
 
Last edited:

fifiddu70

Well-Known Member
Licensed User
Longtime User
Sicuramente meglio.
Il nome del file potrebbe anche essere insensato, meglio per scrivere quel che si vuole per sapere cosa è.
Si hai ragione, solo che sto pensando ad un particolare .... essendo una sound board che dovrà far ascoltare 10 suoni diversi, come dovreì gestirli ? dovrei creare 10 variabili content choiser per 10 file audio o come? ancora non ho avuto tempo di riflettere perchè sto facendo un'altra cosa ma mi e venuto in mente questo dubbio.
 

LucaMs

Expert
Licensed User
Longtime User
Io ho sviluppato tutto il progetto, bellissimo, ovviamente ?, compresa fa faccenda del "titolo" da mettere nelle Label, salvataggio e recupero del tutto.

Quello che manca è... la risposta di Erel, importante perché non ci si può più affidare a GetPathFromContentResult, che su alcuni dispositivi manderebbe l'app in crash (e non credo pochi).

Certo che se l'utente dovesse cercare i file audio solo in alcune cartelle del proprio smartphone, potrebbe funzionare, ma non è detto che lo faccia.
 

fifiddu70

Well-Known Member
Licensed User
Longtime User
Avevo anche pensato di creare un percorso da far caricare i file audio li direttamente e chiamarli da quella cartella ma è troppo laboriosa per l'utente, mentre quella di cercali su tutto il telefono il file da suonare e meglio.
 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…