Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Sono ormai definitive le nuove norme del Codice della Strada per i monopattini elettrici. Non solo targa e assicurazione, le regole sono tante e riguardano diversi aspetti, vi spieghiamo come evitare sanzioni che possono essere salate
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta
DLSS 4.5 introduce Dynamic Multi Frame Generation e MFG 6X, permettendo fino a cinque frame generati per ogni frame renderizzato. I test su Cyberpunk 2077 e 007 First Light mostrano forti incrementi di FPS e riduzione della latenza su RTX 5090 Laptop. Migliorano fluidità, stabilità e qualità visiva.
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Quattro modi di indossarlo, stessa app del Plaud Note Pro e integrazione con il desktop. Il registratore IA da indossare di Plaud eccelle in mobilità, ma resta vincolato all'abbonamento ed è facile da perdere
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-10-2004, 18:33   #1
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
[C] Modificare attributi file mp3

Salve a tutti! Vorrei fare un programmino in c che mi permetta di modificare gli attributi ID3v1 di alcuni file mp3 (titolo, artista, anno, genere...). Ho fatto una ricerchina veloce ma mi appaiono tutti siti di mp3 da scaricare...
Qualcuno mi sa dare una mano???
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 31-10-2004, 09:05   #2
Blackat
Senior Member
 
L'Avatar di Blackat
 
Iscritto dal: Oct 2004
Città: Acireale
Messaggi: 447
ID3.ORG
Blackat è offline   Rispondi citando il messaggio o parte di esso
Old 01-11-2004, 18:13   #3
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
per quanto riguarda il C/C++ quel sito mi rimanda a questa pagina da dove ho scaricato la versione 3.8.3.
tuttavia qualsiasi documentazione reperibile su quel sito si riferisce al c++ e non al c.
non so dove cercare...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 01-11-2004, 19:10   #4
SnakePlissken
Member
 
L'Avatar di SnakePlissken
 
Iscritto dal: Aug 2004
Messaggi: 39
Ma ti serve il programma già fatto oppure solo delle indicazioni su come farlo?
SnakePlissken è offline   Rispondi citando il messaggio o parte di esso
Old 02-11-2004, 00:06   #5
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
no, voglio farmi un programmino che mi sistemi gli id3 in un certo formato. sono stanco di farlo sempre io a mano! (anch perchè altrimenti dovrei farmi 17 cd e non è bello... almeno così imparo come gestire (mi basta anche in modo basilare) gli id3 in c.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 02-11-2004, 20:08   #6
SnakePlissken
Member
 
L'Avatar di SnakePlissken
 
Iscritto dal: Aug 2004
Messaggi: 39
Avevo fatto un programmino a suo tempo, ma dovrei vedere se me lo ritrovo in qualche floppy ...il mio disco rigido l'anno scorso ha tolto del fumo....

Comunque vedrò di spiegarti qualcosa, per quanto mi ricordo.

Innanzitutto esistono due tipi principali di tag ID3, la versione 1.0/1.1 e la 2.4 (questa mi pare sia l'ultima... o almeno lo era quando mi interessavo di tag qualche annetto fa).

Esistono differenze sostanziali tra le due.
Innanzitutto la 1.1 (che si differenzia dalla 1.0 solo perché permette l'inserimento del numero di traccia... mi pare) è molto semplice, mentre la 2.4 è veramente complessa, e nelle sue ultime varianti permette addirittura l'inserimento di immagini e testi. Guarda quel sito che ti hanno suggerito per renderti conto tu stesso. Ovviamente sarebbe difficile anche farsi un programma che gestisca tutti i suoi campi...

Perciò meglio pensare al tag ID3v1.
Questo occupa gli ultimi 128 byte del file MP3. Per "prelevarlo" quindi puoi andare a colpo sicuro posizionandoti 128 byte prima della fine del file e leggendoli. Per identificarlo controlla la presenza della sequenza di caratteri "tag" o "TAG" tra i primi tre di tutto questo blocco. Seguono quindi i pochi campi, 6 in tutto. Ecco lo schema completo del blocco:
Codice:
Identificatore  3
Titolo          30
Autore          30
Album           30
Anno            4
Commento        30
Genere          1
TOTALE     =    128 bytes
Una serie di piccole aggiunte.

La prima: questa è la struttura del 1.0. L'1.1 permette anche la memorizzazione del numero di traccia, tuttavia mantiene la totale compatibilità col 1.0: non cambia infatti la dimensione del tag. Sfruttando la relativa inutilità di un campo commento di soli 30 caratteri, infatti, si era stabilito che il numero di traccia fosse inserito proprio come ultimo byte del commento. Ma per essere identificato e non confuso col commento stesso, è preceduto da un carattere 0x00 che lo
delimita, cosicché il campo riservato al commento si riduce a 28 bytes. Se manca il numero di traccia, comunque, il commento può prendersi tutti i 30 bytes.

La seconda: I campi sono fissi, non puoi cambiare la loro dimensione e in caso non li occupi tutti, devi riempirli con 0x00 (meglio fare così che utilizzare gli spazi 0x20).

Terza: l'anno va memorizzato come stringa (di quattro caratteri).

Quarta: per il genere si utilizza una tabella bella lunga con un 150 generi ad ognuno dei quali corrisponde un numero ... purtoppo anche questa dovrei vedere se me la ritrovo da qualche parte. Faccio una ricerchina e domani ti riferisco.

Buona programmazione!

Ciao!

Ultima modifica di SnakePlissken : 02-11-2004 alle 20:12.
SnakePlissken è offline   Rispondi citando il messaggio o parte di esso
Old 02-11-2004, 23:53   #7
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
SnakePlissken meriti tutto il mio rispetto!!!
sei stato veramente chiaro nella spiegazione! ho però una domanda che riguarda il genere.
la tabella l'ho trovata a questo sito: http://www.mp3-howto.com/mp3-howto-22.html, non so come viene memorizzato il genere visto che non può essere come stringa perchè occupa un solo byte (secondo le indicazioni che mi hai fornito, e che ho anche visto sul sito www.id3.org), ma come fa a rappresentare i numeri fino a 128?
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 03-11-2004, 16:34   #8
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
ho trovato da solo la risposta: sia il genere che il track sono due char.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 03-11-2004, 19:59   #9
SnakePlissken
Member
 
L'Avatar di SnakePlissken
 
Iscritto dal: Aug 2004
Messaggi: 39
Quote:
Originariamente inviato da VegetaSSJ5
SnakePlissken meriti tutto il mio rispetto!!!

Quote:
non so come viene memorizzato il genere visto che non può essere come stringa perchè occupa un solo byte, ma come fa a rappresentare i numeri fino a 128?
In realtà un solo byte potrebbe memorizzare numeri da 0 fino al 255, in tutto 256 = 2^8 = (base binaria)^(bit a disposizione). Non devi vederlo come un char, ma considerarlo come un piccolo (unsigned) intero.
Quote:
ho trovato da solo la risposta
Ma sì che le sai queste cose...
Quote:
sia il genere che il track sono due char
ricorda però che il genere c'è sempre, mentre la track no (è un'intrusa!)!
SnakePlissken è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2004, 15:37   #10
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da SnakePlissken
La seconda: I campi sono fissi, non puoi cambiare la loro dimensione e in caso non li occupi tutti, devi riempirli con 0x00 (meglio fare così che utilizzare gli spazi 0x20).
come faccio ad inserire in una stringa il carattere 0x00??

per caso è così??
Codice:
char stringa[30];
   .
   .
stringa[i]= (char) 0x00;
oppure è semplicemente
Codice:
stringa[i]= (char) 0;

Ultima modifica di VegetaSSJ5 : 06-11-2004 alle 15:40.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 06-11-2004, 18:55   #11
SnakePlissken
Member
 
L'Avatar di SnakePlissken
 
Iscritto dal: Aug 2004
Messaggi: 39
Queste notazioni sono tutte valide:
Codice:
stringa[i] = 0x00;  // esadecimale (1 byte)
stringa[i] = 0;     // decimale
stringa[i] = 00;    // ottale
stringa[i] = '\0';  // codice ASCII del carattere
e puoi utilizzarle con o senza cast.
Io preferisco utilizzare 0x00 perché è intrinseca la specificazione di singolo byte, tu puoi fare come di più ti piace!

SnakePlissken è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2004, 12:17   #12
cikko
Member
 
L'Avatar di cikko
 
Iscritto dal: Sep 2004
Città: vicino a Cosenza
Messaggi: 61
Ciao,
stavo facendo qualcosa di simile in C++, senza usare alcuna libreria esterna.
Siccome devo corregere un po' di errori nella scrittura dei tag ID3, posto solo il codice per la lettura:

<code>
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;

int main(int argc, char** argv)
{
if (argc == 1) {
cout << "Devi specificare un file .mp3!\n";
exit(EXIT_FAILURE);
}

fstream fin;

char buf[129];

fin.open(argv[1], ios::in | ios::binary); // apertura file in modalità binaria
fin.seekg(-128, ios::end); // posizionamento 128 byte prima di EOF
fin.read(buf, 128); // memorizzo questi 128 byte nel buffer di byte

//controllo se è presente la stringa TAG
if (strncmp(buf, "TAG", 3)) {
cout << "TAG ID3 mancanti o file non valido!" << endl;
exit(EXIT_FAILURE);
}

/* stampa artista traccia, byte 33..62 */
cout << "ARTISTA: ";
for (int i = 33; i <= 62; i++)
if ((buf[i] == ' ') && (buf[i+1] == ' '))
break;
else
cout << buf[i];
/* stampa album, byte 63..92 */
cout << "\nALBUM: ";
for (int i = 63; i <= 92; i++)
if ((buf[i] == ' ') && (buf[i+1] == ' '))
break;
else
cout << buf[i];
/* stampa traccia, byte 3..32 */
cout << "\nTITOLO: ";
for (int i = 3; i <= 32; i++)
if ((buf[i] == ' ') && (buf[i+1] == ' '))
break;
else
cout << buf[i];
</code>
__________________
<| http://fgr.altervista.org |>
<| GNU/Linux Registered User #365929 |>
<| GnuPG/OpenPGP key available |>
cikko è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2004, 13:26   #13
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
il codice per la lettura l'ho finito (in c), ora devo perfezionare quello per la scrittura ma purtroppo in questi giorni non ho molto tempo da dedicarci...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 07-11-2004, 23:55   #14
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
scusate ho fatto una domanda idiota...

Ultima modifica di VegetaSSJ5 : 08-11-2004 alle 01:18.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 10-11-2004, 00:01   #15
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
ragazzi ho terminato la prima versione del mio programmino che permette di editare i tag id3v1.1. va migliorato sicuramente cmq intanto lo allego.

Allegato a pagina 2

Ultima modifica di VegetaSSJ5 : 27-12-2004 alle 10:47.
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 10-11-2004, 18:00   #16
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
mi raccomando non vi accalcate a scaricare il file giusto per darmi un parere...

accetto qualsiasi critica, anche "è inutile ed è programmato male", ma almeno scrivete qualcosa...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 10-11-2004, 18:34   #17
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
[non l'ho compilato e provato per davvero ma] Sembra ben scritto. Bravo.
L'unica cosa che a me non piace e' che non vai a capo all'inizio di un nuovo blocco, nemmeno quando inizi una routine... e poi io avrei evitato una initgenreV ed avrei usato valori costanti in una static array. Per il resto mi sembra niente male.

P.S.: oltre ad id3.org e gli altri link, guardati il sito di LAME, l'ottimo encoder open source. Puoi prendere spunti da li se vuoi anche il supporto id3v2.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 10-11-2004, 19:11   #18
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
non ho mai usato array statici, per questo non mi è venuta l'idea. cmq ho provato ad inizializzare l'array al di fuori del codice delle funzioni (nella dichiarazione delle variabili globali) ma il compilatore mi dava errore. usando l'array statico come potrei inizializzarlo anche fuori dalle funzioni??
Quote:
L'unica cosa che a me non piace e' che non vai a capo all'inizio di un nuovo blocco, nemmeno quando inizi una routine...
il fatto è che ormai mi ci sono abituato a programmare così e non mi ci vedo proprio a scrivere codice nell'altro modo.

per quanto riguarda il sito di lame tu a quale ti riferisci? io sono andato qui http://lame.sourceforge.net ma non ho trovato alcuna info...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 10-11-2004, 19:19   #19
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
bug dl programma:
se l'anno è di 4 cifre, quando si visualizzano le informazioni, la riga Year:... è di questo formato:

Year: <anno><commento>

come mai stampa il commento a fianco all'anno? eppure nella struttura id3v1 l'anno è dichiarato array di 5 caratteri...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 11-11-2004, 12:47   #20
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Forse quando l'anno è più corto di quattro cifre trova la char[] riempita con caratteri nulli (0) e quindi si ferma, altrimenti no... comunque, usa \n alla [/i]fine[/i] di ogni printf, non all'inizio: in alcuni casi printf non stampa sullo schermo fino al prossimo \n, e quindi alcuni messaggi potrebbero non vedersi mai.

Per l'array statico, basta usare:
Codice:
static char * genreV[125] = {"blues", "classic rock", "...", "e così fino alla fine"};
Quote:
accetto qualsiasi critica, anche "è inutile ed è programmato male"
Nessun programma è inutile per il programmatore, visto che è comunque un modo di migliorare le proprie capacità. E poi, si, ci sono alcune cose che potrebbero essere migliori, ma alla fine basta che sia bug-free...
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro Redmi Watch 6 in prova: lo smartwatch con ampio ...
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ...
La NASA ha annunciato gli astronauti del...
Mondiale 2026, Lenovo unico partner tecn...
007 First Light ha venduto più di...
Harley-Davidson, svelato il prezzo itali...
PC Windows 11 in crash: ma la colpa è di...
Dopo i 'NO 5G' arrivano i 'NO FIBRA'? Ar...
Promettono un parco e costruiscono un da...
L'aeroplano supersonico ''silenzioso'' N...
Euro-Office sbugiardata da LibreOffice: ...
I 10 sconti TOP Amazon: 4 novità ...
Galaxy Z Flip 8, in Europa avrà i...
SpaceX annuncia i satelliti AI1 destinat...
Ariston DEOS 10 EVO a 103€: deumidificat...
Cina pronta a investire 295 miliardi di ...
Gli israeliani di NSO Group continuano a...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 17:37.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v