längenzusammenstellung per programm
#1
moin moin,

eine andere betreffbezeichnung ist mir leider nicht eingefallen Sad 

was will ich ?

ich hätte gerne ein programm welches mir eine liste ausgibt in welcher songs aufgeführt sind, die zu einer vorgegebenen spielzeitlänge passen.

also z.b., ich habe einen ordner der eine anzahl x titel enthält und ich habe eine mc mit einer spielzeit von 45' , nun soll das programm raussuchen welchen titel
ich überspieln kann um möglichst genau an die spielzeit ranzukommen.
das ganze soll unabhängig vom fileformat ( mp3, wav, flac etc. ) sein und unter linux mint laufen.

reginald Huh
Das wahre Verbrechen verübt die volkstümliche Musik am Gehörgang der Menschheit.
( Benno Berghammer )
Zitieren
#2
Ich kann mir schwer vorstellen, daß es sowas schon gibt. Aber es klingt wie eine Idee für ein eigenes Projekt.

Librosa für Python könnte beim Ermitteln der Spielzeiten behilflich sein.
Zitieren
#3
Hallo Reginald,

ich kenne kein fertiges Programm für genau diesen Zweck.

Informationen über einzelne Files gibt Dir aber z.B. soxi aus, mit soxi -D * bekommst Du alle Längen aller Files im Verzeichnis ausgegeben, aber leider ohne Dateiname. Da hilft eine kleine Schleife:

Code:
for i in *; do echo -ne $i\\t; soxi -D $i; done

(soxi sollte im Paket sox enthalten sein... wenn es noch nicht installiert ist, hilft "sudo apt install sox" weiter).

Die Ausgabe davon kannst Du leicht in eine Tabelle (Libreoffice, Excel, ...) einfügen, und dann die Auswahl unter Anzeige der Summe der Spielzeit von Hand vornehmen...

Mit etwas Skript-Arbeit drumherum müsste es auch möglich sein, die gewünschte Liste mit Begrenzung auf eine Spielzeit zu erzeugen. Dabei wäre wichtig, ob Du eine bestimmte Sortierstrategie hast - mir fiele spontan ein, immer den längsten Titel hinzuzufügen, der noch in den verbleibenden Platz passt. Aber damit übersieht man Kombinationen, wo weniger Restzeit übrig bleibt. Mit etwas mehr Aufwand ginge das bestimmt auch...

Also - was ist Dein Optimierungsziel? Möglichst wenig leeres Band am Ende?

Viele Grüße
Andreas
Zitieren
#4
möglichst wenig leeres band und möglichst wenig handarbeit.

reginald
Das wahre Verbrechen verübt die volkstümliche Musik am Gehörgang der Menschheit.
( Benno Berghammer )
Zitieren
#5
(23.10.2021, 16:12)andreas42 schrieb: mir fiele spontan ein, immer den längsten Titel hinzuzufügen, der noch in den verbleibenden Platz passt. Aber damit übersieht man Kombinationen, wo weniger Restzeit übrig bleibt.

Ich hatte eben exakt den gleichen Gedankengang. Wenn man mal (einfach konstruierter Fall) von 10 MB freiem Platz ausgeht, und man hat folgende Dateien:

5 MB
4 MB
2 MB
2 MB
2 MB

... und dann würde man nach dem "Immer die größte Datei, die noch passt"-Prinzip vorgehen, dann würde man die Dateien von 5 und 4 MB nehmen, und am Ende wäre noch 1 MB freier Platz übrig. Mit 4 MB und drei mal 2 MB würde man den Platz dagegen optimal nutzen. Aber wie kann man das herausfinden, ohne alle Kombinationen rechenzeitintensiv durchzuprobieren? Gibt's dafür einen Algorithmus? Huh

Das müsste man mal tiefgehend drüber nachdenken.

Edit: Zweiter Anlauf. Das Ziel war ja nicht, einen einzelnen Datenträger mit den vorhandenen Daten optimal auszufüllen (was ich oben getan habe), sondern die Gesamtmenge der Daten auf möglichst wenige Datenträger (mit möglichst wenig freiem Platz) zu verteilen. Und dann könnte es doch sein, daß die Methode "Immer die größte Datei, die noch passt" zum optimalen Ergebnis führt.

Ein möglicherweise störender Effekt wäre allerdings, daß die großen Dateien tendenziell auf den ersten CDs landen würden, während der letzte viele kleine Dateien enthielt. Bei Musikstücken könnte dann zum Schluss ein reiner Punk-Sampler herauskommen. Big Grin
Zitieren
#6
Es ist nachts und ich habe wohl einfach zu viel Langeweile. Hier meine erste Variante wie man sowas programmieren kann:

Code:
#!/bin/bash
tempfile="/tmp/bla"
tapelength=$(( $1 * 60 ))
param=$2

if test -f $tempfile; then
    rm $tempfile
fi

for i in *.opus; do
    echo "$(soxi -D ${i}):${i}" >> $tempfile
done

if test "${param}" = "-s" ; then
    sort -r -o $tempfile $tempfile
fi

curlength=0
tapedone=0
while read song ; do
    if test $tapedone -eq 0 ; then
        songlength=$(echo $song | cut -d ":" -f 1 | cut -d "." -f 1)
        songname=$(echo $song | cut -d ":" -f 2)
        if test $curlength -lt $tapelength ; then
            newlength=$(($curlength + $songlength))
            if test $newlength -lt $tapelength ; then
                echo $songname
                curlength=$newlength
            fi
        else
            tapedone=1
        fi
    fi
done < $tempfile
rm $tempfile

Zu beachten:
- Es werden nur .opus-Dateien berücksichtigt, das kann man in der Schleife anpassen
- Es wird nicht gerundet oder exakt gerechnet, sondern die Millisekunden von den Sekunden abgeschnitten. Sollte aber zu verschmerzen sein
- Bisher arbeitet das Script noch nicht rekursiv, das kann man zum Beispiel mittels find-Befehl nachrüsten
- Über den Parameter -s kann man die Lieder so sortieren, dass die ersten Lieder zuerst aufs Band kommen
- Das von Andreas erwähnte Paket sox wird benötigt

Das Script erwartet als ersten Parameter die Länge des Bands in Minuten. Mein Vorschlag ist, das Script nach /usr/local/bin oder einen anderen Pfad innerhalb des PATH zu packen, da man es dann von jedem Ordner aus aufrufen kann.

Ein Beispielaufruf wäre dieser hier. Angenommen, man möchte das Klaus Lage-Album "Heiße Spuren" mobil auf seinem Uher Report in 19 cm/s auf Langspielband hören. Dann wären Aufruf und Ausgabe:
Code:
$ musicselector.sh 30
01_Starke-Schlaege.opus
02_Out.opus
03_Stille-Wasser.opus
04_Vermisst.opus
05_Faust-auf-Faust-Schimanski.opus

Fügt man den Parameter -s hinzu, kommen dabei die längsten Titel des Albums zuerst. Das Script entscheidet sich nun auch für andere Titel, da es nicht mehr chronologisch, sondern rein nach Länge vorgeht:
Code:
$ musicselector.sh 24 -s
11_Weihnachtszeit.opus
05_Faust-auf-Faust-Schimanski.opus
08_Universum.opus
03_Stille-Wasser.opus
06_Taxi.opus

Ich hoffe das genügt als Basis. Geht sicher deutlich besser, aber angesichts der Uhrzeit bin ich froh, überhaupt etwas lauffähiges zusammengebastelt zu haben. Können wir hier im Forum sicher noch gemeinsam an einigen Stellen verbessern oder eventuell sogar komplett anders aufbauen, ist erstmal nur eine Grundidee.

Gute Nacht euch allen, ich bin mal gespannt, was aus diesem Script wird, irgendwer hat sicher Ideen wie man es verbessern kann.
Schnürsenkelband: Teac A3300SX-2T, Revox A77 MK3, Sony TC-366, Grundig TK 3200, Grundig TK 8, Simonetta TB 491
Kassette: Onkyo TA-2870, RFT SK 3000 Hifi
--
Lieblings-Bandsorten / Empfehlungen in zufälliger Reihenfolge:
Standardband: Orwo 104, Orwo 106, Orwo 103, Orwo 100, BASF/Agfa PER-528
Langspielband: Orwo 113, BASF/Agfa PER-368, LPR-35, BASF PES-40, BASF LGS-35, Agfa PE-31/PE-36/PE-39
Doppelspielband: Orwo 120, BASF LGS-26, Agfa PE-41/PE-46/PE-49, Grundig GD15
Dreifachspielband: Orwo 130
Zitieren
#7
moin moin,

es ist immer noch nacht.

danke für eure mühe.

an timo, das mit der dateigrösse funktioniert so nicht, weil z.b. 1' mp3 datei und 1' wav schon unterschiedliche grössen haben und das ganze ja auf analoges band soll, da kommt man nur mit min und sec weiter.

reginald

p.s. ich muss mich nochmal aufs ohr hauen
Das wahre Verbrechen verübt die volkstümliche Musik am Gehörgang der Menschheit.
( Benno Berghammer )
Zitieren
#8
Geht es denn darum, ein langes Album aufzunehmen und die Bandlänge bzw. erste Seite optimal auszunutzen?
Dann würde ich die Lieder nach Albumreihenfolge hinzufügen, bist die Bandlänge überschritten ist. Dann den letzten Track aus der Liste entfernen und von den übrigen die raussuchen, die kürzer sind als die verbleibende Bandlänge und von denen dann das längste auswählen. So machen das auch CD-Player mit so einer Funktion.

Wenn es sich um einen Ordner mit vielen Liedern von verschiedenen Alben handelt (Mixtape), dann würde ich erst die Reihenfolge zufällig mischen und mit dem Ergebnis genauso verfahren wie bei einem Album.
Ich persönlich würde in diesem Fall aber die Reihenfolge selbst festlegen, damit es eine schöne Mischung wird und die Lieder sich gut aneinanderreihen.

Gruß
Robert
Zitieren
#9
Das ist ein Problem der "Linearen Optimierung" im Sinne des Operations Research.
Im Grunde das Gleiche wie die Verteilung von Gütern unterschiedlicher Größe auf möglichst wenige Standard-Container (oder früher Güter-Waggons).
In den für solche Planungen zuständigen Bereichen von DHL, DB Cargo, etc.  gibt es dafür Computer-Programme, wie zB das klassischen Simplex-Verfahren.
Bekanntestes Problem  aus diesem Gebiet ist der "Travelling Salesman".

MfG Kai
Zitieren
#10
Guck mal hier:
https://www.geeksforgeeks.org/bin-packin...used-bins/

MfG Kai
Zitieren
#11
Da es ja in der Regel eine überschaubare Zahl von Files sind kann man das „brute force“ lösen, also alle Kombinationen rechnen. Die o.g. Lösungen sind m.E. zu komplex, da dabei von unendlichen Datenmengen ausgegangen wird.
Gerhard
Zitieren
#12
Was ist mit "o.g. Lösungen" gemeint ?
Bei den Beispielen des Links in #10 mußte ich nur bis 7 zählen.

MfG Kai
Nachtrag: Noch ein Anwendungsbeispiel (für 3-dimensionale Objekte und Container):
https://www.gigacalculator.com/calculato...ulator.php
Noch'n Nachtrag:
Diese spezielle Thematik läuft in der Fachliteratur unter "1D bin packing problem", siehe zB
https://en.wikipedia.org/wiki/Bin_packing_problem
noch ein Forschungsbeispiel:
https://link.springer.com/chapter/10.100...-47217-1_6
Dazu gibt es allerlei Software, auch bei github
Zitieren
#13
Und noch ein Tip separat speziell für "old socks", die nicht von Pascal / Delphi lassen können:
http://www.delphiforfun.org/Programs/Cut...0Stock.htm
behandelt das fast gleiche "Cutting stock" Problem.
Aus Lagerware 1-dimensionaler Teile (zB 2m-Kupfer-Rohre) sollen n Teile vorbestimmter Länge geschnitten werden, so daß möglichst wenig Rohre benötigt werden.
Die Rohrlänge entspricht der Spielzeit des Speichermediums, die n Teile vorbestimmter Länge den vorliegenden Audio-Files mit ihrer eigenen jeweiligen Dauer.

MfG Kai
Noch ein Link zu einem 1D-Stock-Cutter:
http://astrokettle.com/pr1dsc.html
Da gibt es eine "free version" und eine "30-day trial version"
Die Free Version läuft jetzt bei mir. Hasse ma n' Beispiel ?
Zitieren
#14
Unabhängig von der Berechnungsmethode gibt es noch einen Pferdefuß bei dem Vorhaben, Cassettenseiten exakt auszunutzen. Besser gesagt derer zwei:

- Nicht alle Cassettendecks laufen mit Sollgeschwindigkeit. Innerhalb der zulässigen Toleranzen kann der Unterschied bei einer C-90-Seite schon +/- 1 min betragen.

- Nicht alle Cassetten sind gleich lang. Bei den Japanern und auch ab 1990 bei BASF waren 135 m üblich für eine C-90. Damit erreicht man auf einem mit absolut korrekter Geschwindigkeit laufenden Gerät 47 Minuten und 15 Sekunden pro Seite. Ältere europäische Cassetten hatten 132 m Band, was für 46:30 Aufnahmezeit reicht. Unter den aktuell hergestellten Cassetten gibt es einige, die keinen Meter zu viel eingespult haben: Da bekommt man tatsächlich 45 Minuten plus maximal ein paar Sekunden auf eine Seite. Auch "Befüller"-Cassetten, die man z.B. bei Tapemuzik in indiviuellen Längen bestellen kann, haben meist die exakte Laufzeit.

Viele Grüße,
Martin
Zitieren
#15
hallo

liegt wahrscheinlich daran, das bei der Tonband/Cassetten-Technik ja Zoll und Fuß die Bezugsgrößen sind. Da rundet man dann erst mal auf "glatte" Fuß und dann nochmal auf "glatte" Meter, und dabei variiert auch noch das "glatt".
BTW: ich gehe davon aus, das die Bandgeschwindigkeiten in cm/s nur Näherungen sind, also tatsächlich die Reihe
(30" -> 15" -> 7,5" -> 3 3/4" -> 1 7/8" -> 15/16") pro sec. die richtigen Werte sind, oder?

Grüße

Frank
A77 MKIV 1/2-Spur, B77 MKII 1/4-Spur, B710-MKII, AKAI-GX 265D 1/4-Spur-AR
Zitieren
#16
moin moin,

ich habe mich für ein mittelding entschieden.
jetzt verwende ich dafür DEADBEEF, der player spielt die audioformate ab welche bei vorkommen.
er zeigt die gesamtzeit und die einzelzeit der tracks an, so kann ich genau genug sehen was weg muss
oder wieviel evtl. noch fehlt.
ich habe im übrigen für jede kassettensorte schon immer getestet wie lang die sind.

vielen dank für die anregungen und hilfe

reginald

p.s. auch wenn ich keinen schiffscontainer beladen will :o)
Das wahre Verbrechen verübt die volkstümliche Musik am Gehörgang der Menschheit.
( Benno Berghammer )
Zitieren
#17
Vor der "reinen" Mathematik sind alle Container gleich.

MfG Kai
Zitieren
#18
die Aufgabe mit den Cassetten wäre aber viel einfacher, weil nur eindimensional, die mit einem realen Container ist ja mind. 3 wenn nicht 4-6 dimensional.

Frank
A77 MKIV 1/2-Spur, B77 MKII 1/4-Spur, B710-MKII, AKAI-GX 265D 1/4-Spur-AR
Zitieren
#19
moin moin dilbert,

also die 4. dimension ist die zeit, aber was wäre dann 5. und 6. dimension ?
überraum, hyperraum, verlassen des ereignishorizonts ?

ich denke wir sollten das thema hier abschließen.

reginald
Das wahre Verbrechen verübt die volkstümliche Musik am Gehörgang der Menschheit.
( Benno Berghammer )
Zitieren
#20
Dilbert hat völlig recht,
zB bei der Anwendung bei Schiffs-Containern ist die 4.te Dimension meist das Gewicht des Einzelstücks...
damit nicht alle Blei-Pakete in den gleichen Container kommen.
5te und 6te könnten zB magnetisches Feld und Magnetisierbarkeit sein,
damit nicht Supermagnete und Magnetbänder in den gleichen Container gepackt werden.

MfG Kai
Zitieren
#21
Ich habe mich mal durch die Stichworte von Kai gewühlt und dann u.A. das hier gefunden:
https://www.herber.de/forum/archiv/1028t...Summe.html

Das habe ich als Basis genommen und mal in Excel was zusammengebastelt:

.zip   Titel Kombination auf Band Ermitteln.zip (Größe: 23.03 KB / Downloads: 1)

Spalten:
A) Titel-Nummer: Fortlaufende Nummer für Ausgabe in Spalte G
B) Titel-Länge: Länge in dezimalen Minuten
C) Ziel-Spielzeit: Länge die gefüllt werden soll
D) Titel-Treffer: Binäres Feld mit den Titeln die gefunden wurden (Bsp "01011" bei insgesamt 5 Titeln dann die Titelnummern #2 #4 #5)
E) Spielzeit-Summanden: Die einzelnen Titelspielzeiten aus Spalte B
F) Spielzeit-Summe: Summe der Spielzeiten aus Spalte E
G) Titel-Abfolge: Wie Spalte D, aber als Klartextnummern

Spalten B und C müssen eingegeben werden, in Spalten D, E, F wird ausgegeben

Beispiel:

   

Es sind 5 Titel vorhanden, mit den Spielzeiten in Spalte B.
Ziel ist es, 10min voll zu bekommen (Vorgabe in Spalte C).
Spalte G zeigt mögliche Titelabfolgen die passen. Die letzte ist immer die, die am nächsten am Ziel ist.
Hier also 9,5min mit den Titeln #1, #4, #5.

Hab das mit einigen Beispielen durchgetestet, scheint zu funktionieren.
Wer Fehler findet, darf diese gerne hier rein schreiben.
Interesse an der Fortführung ?

PS:
Das ganze ist eine Excel .xlsm Datei, also mit Makros.
Nach dem Öffnen in Excel muß ggf. noch die Makroausführung erlaubt werden.
Gruß, Kuni
..............................

http://kuni.bplaced.net/
..............................
Zitieren
#22
Kai, ich will immer noch keinen container beladen.

reginald
Das wahre Verbrechen verübt die volkstümliche Musik am Gehörgang der Menschheit.
( Benno Berghammer )
Zitieren
#23
Das glaube ich gerne,
es sind ja nur Beispiele für die Anwendung eines abstrakter formulierbaren Problems,
das schon vielfach bearbeitet wurde, weil es eine intellektuelle/mathematische Herausforderung darstellt.

Vielleicht möchtest du aber in jeder Cassetten-Zuammenstellung
einen Track von den Beatles, zwei von den Stones, 3 von Steve Vai, eines von Zappa , 5mal Blues-Rock,
ein türkisches Volkslied auf der Baglama, 2 Tracks von Lance Lopez und mindestens 1 von Wes Jeans unterbringen.
Die musikalischen Unter-Genres bzw Künstler wären dann auch je eine Dimension...

Nix für ungut
mfG Kai
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste