Skip to content

Commit 4cd15d9

Browse files
committed
Finished reading mxsnd.
1 parent 519f787 commit 4cd15d9

11 files changed

Lines changed: 846 additions & 74 deletions

File tree

documentation/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
## 14.0.1 (unreleased)
44

5-
* Improved logging output of missing samples.
5+
* Logging: Improved logging output of missing samples. Added ConvertWithMoss version number to log.
66
* DecentSampler
77
* New: The value for the amplitude velocity sensitivity is now initialised in the template via the new variable %ENV_VELOCITY_SENSITIVITY%.
88
* New: The delay Mix default value is now set to zero in the template.
566 Bytes
Binary file not shown.

src/main/java/de/mossgrabers/convertwithmoss/core/ConverterBackend.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import de.mossgrabers.convertwithmoss.format.music1010.Music1010Detector;
4141
import de.mossgrabers.convertwithmoss.format.ni.kontakt.KontaktCreator;
4242
import de.mossgrabers.convertwithmoss.format.ni.kontakt.KontaktDetector;
43+
import de.mossgrabers.convertwithmoss.format.ni.maschine.MaschineDetector;
4344
import de.mossgrabers.convertwithmoss.format.samplefile.SampleFileDetector;
4445
import de.mossgrabers.convertwithmoss.format.sf2.Sf2Creator;
4546
import de.mossgrabers.convertwithmoss.format.sf2.Sf2Detector;
@@ -104,7 +105,7 @@ public ConverterBackend (final INotifier notifier)
104105
new KontaktDetector (notifier),
105106
new KMPDetector (notifier),
106107
new KorgmultisampleDetector (notifier),
107-
// new MaschineDetector (notifier),
108+
new MaschineDetector (notifier),
108109
new EXS24Detector (notifier),
109110
new SxtDetector (notifier),
110111
new SampleFileDetector (notifier),
@@ -190,6 +191,7 @@ public void detect (final IDetector<?> detector, final ICreator<?> creator, fina
190191
this.collectedPresetSources.clear ();
191192
this.collectedPerformanceSources.clear ();
192193

194+
this.notifier.log ("TITLE");
193195
this.notifier.log ("IDS_NOTIFY_DETECTING");
194196
this.creator.clearCancelled ();
195197
this.detector.detect (sourceFolder, new MultisampleSourceConsumer (), new PerformanceSourceConsumer (), detectPerformances);

src/main/java/de/mossgrabers/convertwithmoss/core/detector/AbstractDetector.java

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -546,8 +546,6 @@ public static IFileBasedSampleData createSampleData (final File sampleFile, fina
546546
final String fileEnding = sampleFile.getName ().toLowerCase ();
547547
try
548548
{
549-
IFileBasedSampleData sampleData = null;
550-
551549
// Note: only AIF ending is picked up as correct ending below and it also does not
552550
// accept all AIFF files
553551
if (fileEnding.endsWith (".aiff") || fileEnding.endsWith (".aif"))
@@ -562,30 +560,29 @@ public static IFileBasedSampleData createSampleData (final File sampleFile, fina
562560
throw new IOException (Functions.getMessage ("IDS_ERR_COMPRESSED_AIFF_FILE", sampleFile.getName (), commonChunk.getCompressionName (), compressionType));
563561
}
564562

565-
sampleData = new AiffFileSampleData (sampleFile);
563+
return new AiffFileSampleData (sampleFile);
566564
}
567-
else if (fileEnding.endsWith (".ncw"))
568-
sampleData = new NcwFileSampleData (sampleFile);
569-
else
565+
566+
if (fileEnding.endsWith (".ncw"))
567+
return new NcwFileSampleData (sampleFile);
568+
569+
IFileBasedSampleData sampleData = null;
570+
final AudioFileFormat audioFileFormat = AudioSystem.getAudioFileFormat (sampleFile);
571+
final AudioFileFormat.Type type = audioFileFormat.getType ();
572+
if (AudioFileFormat.Type.WAVE.equals (type))
570573
{
571-
final AudioFileFormat audioFileFormat = AudioSystem.getAudioFileFormat (sampleFile);
572-
final AudioFileFormat.Type type = audioFileFormat.getType ();
573-
if (AudioFileFormat.Type.WAVE.equals (type))
574-
{
575-
if (AudioFileUtils.checkSampleFile (sampleFile, notifier))
576-
sampleData = new WavFileSampleData (sampleFile);
577-
}
578-
else if (AudioFileFormat.Type.AIFF.equals (type))
579-
sampleData = new AiffFileSampleData (sampleFile);
580-
else if (OGG_TYPE.equals (type))
581-
sampleData = new OggFileSampleData (sampleFile);
582-
else if (FLAC_TYPE.equals (type))
583-
sampleData = new FlacFileSampleData (sampleFile);
584-
585-
if (sampleData == null)
586-
throw new IOException (Functions.getMessage (IDS_ERR_SOURCE_FORMAT_NOT_SUPPORTED, type.toString ()));
574+
if (AudioFileUtils.checkSampleFile (sampleFile, notifier))
575+
sampleData = new WavFileSampleData (sampleFile);
587576
}
577+
else if (AudioFileFormat.Type.AIFF.equals (type))
578+
sampleData = new AiffFileSampleData (sampleFile);
579+
else if (OGG_TYPE.equals (type))
580+
sampleData = new OggFileSampleData (sampleFile);
581+
else if (FLAC_TYPE.equals (type))
582+
sampleData = new FlacFileSampleData (sampleFile);
588583

584+
if (sampleData == null)
585+
throw new IOException (Functions.getMessage (IDS_ERR_SOURCE_FORMAT_NOT_SUPPORTED, type.toString ()));
589586
return sampleData;
590587
}
591588
catch (final UnsupportedAudioFileException | IOException ex)

src/main/java/de/mossgrabers/convertwithmoss/file/StreamUtils.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,6 +527,33 @@ public static double readDouble (final InputStream in, final boolean isBigEndian
527527
}
528528

529529

530+
/**
531+
* Parses a variable-length little-endian integer from an InputStream.
532+
*
533+
* @param in The input stream to read from
534+
* @return The parsed integer
535+
* @throws IOException If an I/O error occurs or the stream ends prematurely
536+
*/
537+
public static int readVariableLengthNumberLE (final InputStream in) throws IOException
538+
{
539+
int length = in.read ();
540+
if (length < 0 || length > 4)
541+
throw new IOException ("Invalid byte length: " + length);
542+
543+
int result = 0;
544+
for (int i = 0; i < length; i++)
545+
{
546+
int b = in.read ();
547+
if (b == -1)
548+
throw new IOException ("Unexpected end of stream");
549+
// Little-endian
550+
result |= (b & 0xFF) << (8 * i);
551+
}
552+
553+
return result;
554+
}
555+
556+
530557
/**
531558
* Reads all bytes from an input stream and interprets it as UTF-8 text.
532559
*

src/main/java/de/mossgrabers/convertwithmoss/file/iff/IffFile.java

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -46,22 +46,29 @@ public class IffFile
4646
*/
4747
public static IffChunk readChunk (final InputStream in) throws IOException
4848
{
49-
String chunkID = StreamUtils.readASCII (in, 4);
50-
51-
long size = StreamUtils.readUnsigned32 (in, true);
52-
53-
// If it is a FORM, LIST or CAT chunk return the actual FORM type
54-
if (GROUP_CHUNKS.contains (chunkID))
49+
try
5550
{
56-
chunkID = StreamUtils.readASCII (in, 4);
57-
size -= 4;
51+
String chunkID = StreamUtils.readASCII (in, 4);
52+
53+
long size = StreamUtils.readUnsigned32 (in, true);
54+
55+
// If it is a FORM, LIST or CAT chunk return the actual FORM type
56+
if (GROUP_CHUNKS.contains (chunkID))
57+
{
58+
chunkID = StreamUtils.readASCII (in, 4);
59+
size -= 4;
60+
}
61+
62+
final byte [] data = in.readNBytes ((int) size);
63+
// Chunk length is always 2 aligned!
64+
if (size % 2 == 1 && in.available () > 0)
65+
in.skipNBytes (1);
66+
return new IffChunk (chunkID, data);
67+
}
68+
catch (final IllegalArgumentException ex)
69+
{
70+
throw new IOException (ex);
5871
}
59-
60-
final byte [] data = in.readNBytes ((int) size);
61-
// Chunk length is always 2 aligned!
62-
if (size % 2 == 1 && in.available () > 0)
63-
in.skipNBytes (1);
64-
return new IffChunk (chunkID, data);
6572
}
6673

6774

src/main/java/de/mossgrabers/convertwithmoss/format/TagDetector.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
package de.mossgrabers.convertwithmoss.format;
66

77
import java.util.Arrays;
8+
import java.util.Collection;
89
import java.util.Collections;
910
import java.util.Comparator;
1011
import java.util.HashMap;
1112
import java.util.HashSet;
12-
import java.util.List;
1313
import java.util.Locale;
1414
import java.util.Map;
1515
import java.util.Set;
@@ -28,6 +28,7 @@ public class TagDetector
2828
private static final Map<String, String> CATEGORY_LOOKUP = new TreeMap<> (new StringLengthComparator ());
2929
private static final Map<String, String> KEYWORD_LOOKUP = new TreeMap<> (new StringLengthComparator ());
3030

31+
public static final String CATEGORY_UNKNOWN = "Unknown";
3132
public static final String CATEGORY_ACOUSTIC_DRUM = "Acoustic Drum";
3233
public static final String CATEGORY_BASS = "Bass";
3334
public static final String CATEGORY_BELL = "Bell";
@@ -490,7 +491,7 @@ public static String normalizeCategory (final String categoryLabel)
490491
*/
491492
public static String detectCategory (final String [] texts)
492493
{
493-
return detect (texts, CATEGORY_LOOKUP, "Unknown");
494+
return detect (texts, CATEGORY_LOOKUP, CATEGORY_UNKNOWN);
494495
}
495496

496497

@@ -500,9 +501,9 @@ public static String detectCategory (final String [] texts)
500501
* @param texts The texts
501502
* @return The detected tag
502503
*/
503-
public static String detectCategory (final List<String> texts)
504+
public static String detectCategory (final Collection<String> texts)
504505
{
505-
return detect (texts, CATEGORY_LOOKUP, "Unknown");
506+
return detect (texts, CATEGORY_LOOKUP, CATEGORY_UNKNOWN);
506507
}
507508

508509

@@ -524,7 +525,7 @@ public static String detectCategory (final List<String> texts)
524525
* @param texts The texts
525526
* @return The detected keywords
526527
*/
527-
public static String [] detectKeywords (final List<String> texts)
528+
public static String [] detectKeywords (final Collection<String> texts)
528529
{
529530
final Set<String> keywords = new HashSet<> ();
530531
for (final String text: texts)
@@ -584,7 +585,7 @@ public static String detect (final String [] texts, final Map<String, String> lo
584585
* @param defaultTag The tag to return if none matched
585586
* @return The detected tag
586587
*/
587-
public static String detect (final List<String> texts, final Map<String, String> lookupMap, final String defaultTag)
588+
public static String detect (final Collection<String> texts, final Map<String, String> lookupMap, final String defaultTag)
588589
{
589590
final Map<String, String> results = new HashMap<> ();
590591
for (final String text: texts)

src/main/java/de/mossgrabers/convertwithmoss/format/ni/maschine/maschine2/Maschine2Format.java

Lines changed: 7 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import java.io.OutputStream;
1111
import java.io.RandomAccessFile;
1212
import java.nio.channels.Channels;
13-
import java.util.ArrayList;
13+
import java.util.Collections;
1414
import java.util.List;
1515
import java.util.Optional;
1616

@@ -81,17 +81,7 @@ public void writeSound (final OutputStream out, final String safeSampleFolderNam
8181
public List<IMultisampleSource> readSound (final File sourceFolder, final File sourceFile, final InputStream inputStream, final IMetadataConfig metadataConfig) throws IOException
8282
{
8383
final NIContainerItem niContainerItem = new NIContainerItem (inputStream);
84-
final Optional<MaschinePresetAccessor> presetAccessor = this.readMaschinePreset (niContainerItem, sourceFolder, sourceFile, metadataConfig);
85-
final List<IMultisampleSource> multisampleSources = new ArrayList<> ();
86-
if (presetAccessor.isPresent ())
87-
{
88-
// final List<Pair<IMultisampleSource, Sound>> sources = this.convertPrograms
89-
// (presetAccessor.get (), niContainerItem, sourceFile, metadataConfig,
90-
// monolithSamples);
91-
// for (final Pair<IMultisampleSource, Sound> source: sources)
92-
// multisampleSources.add (source.getKey ());
93-
}
94-
return multisampleSources;
84+
return this.readMaschinePreset (niContainerItem, sourceFolder, sourceFile, metadataConfig);
9585
}
9686

9787

@@ -105,7 +95,7 @@ public List<IMultisampleSource> readSound (final File sourceFolder, final File s
10595
* @return Access to the read Maschine data
10696
* @throws IOException Could not read the container
10797
*/
108-
private Optional<MaschinePresetAccessor> readMaschinePreset (final NIContainerItem niContainerItem, final File sourceFolder, final File sourceFile, final IMetadataConfig metadataConfig) throws IOException
98+
private List<IMultisampleSource> readMaschinePreset (final NIContainerItem niContainerItem, final File sourceFolder, final File sourceFile, final IMetadataConfig metadataConfig) throws IOException
10999
{
110100
final NIContainerDataChunk appChunk = niContainerItem.find (NIContainerChunkType.AUTHORING_APPLICATION);
111101
if (appChunk != null && appChunk.getData () instanceof final AuthoringApplicationChunkData appChunkData)
@@ -119,9 +109,9 @@ private Optional<MaschinePresetAccessor> readMaschinePreset (final NIContainerIt
119109
final NIContainerDataChunk presetChunk = niContainerItem.find (NIContainerChunkType.PRESET_CHUNK_ITEM);
120110
if (presetChunk != null && presetChunk.getData () instanceof final PresetChunkData presetChunkData)
121111
{
122-
final MaschinePresetAccessor programAccessor = new MaschinePresetAccessor ();
123-
programAccessor.readMaschinePresetChunks (presetChunkData.getPresetData ());
124-
return Optional.of (programAccessor);
112+
final MaschinePresetAccessor programAccessor = new MaschinePresetAccessor (this.notifier);
113+
final Optional<IMultisampleSource> source = programAccessor.readMaschinePresetChunks (sourceFolder, sourceFile, presetChunkData.getPresetData ());
114+
return source.isPresent () ? Collections.singletonList (source.get ()) : Collections.emptyList ();
125115
}
126116
}
127117

@@ -130,6 +120,6 @@ private Optional<MaschinePresetAccessor> readMaschinePreset (final NIContainerIt
130120
if (autorizationChunk.getData () instanceof final AuthorizationChunkData authorization && !authorization.getSerialNumberPIDs ().isEmpty ())
131121
this.notifier.logError ("IDS_NI_CONTAINER_CONTAINS_ENCRYPTED_SUB_TREE");
132122

133-
return Optional.empty ();
123+
return Collections.emptyList ();
134124
}
135125
}

0 commit comments

Comments
 (0)