2016-11-24 3 views
0

Мне нужно прочитать свойства dwStart и dwEnd в блоке SMPL, потому что эти точки должны указывать начальную точку и конечную точку цикла в образце. Я конвертирую свои библиотеки Directwave в формат .multisample Bitwig, поэтому моему приложению не нужно воспроизводить WAV-файл. Это просто необходимо, чтобы прочитать точки цикла, поэтому он может быть добавлен в XML, который выглядит следующим образом:Как читать SMPL-фрагмент WAV-файла с помощью C#?

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<multisample name="Test Bell"> 
    <generator>Bitwig Studio</generator> 
    <category>Bell</category> 
    <creator>John</creator> 
    <description>Misc</description> 
    <layer name="Default"> 
     <sample file="Bell_004 - C3.wav" gain="0.00" sample-start="0.000" sample-stop="88048.000"> 
      <key track="true" tune="0.00"> 
       <velocity /> 
       <loop mode="sustain" start="58709.000" stop="88048.000" /> 
      </key> 
     </sample> 
    </layer> 
</multisample> 

UPDATE: Код Марк Хит работает, чтобы найти Smpl порций и петли точек в Kontakt WAVs но он не находит в Smpl кусок в WAV файлы, созданные Directwave Например этот файл: http://stash.reaper.fm/28963/Flute_006_C3.wav

Я использовал ниже код и он только нашел инст кусок. Как найти точки начала и конца петли, если нет smpl chunk?

var smp = reader.ExtraChunks.Where(ec => ec.IdentifierAsString != null); 
      foreach (var x in smp) 
      { 
       MessageBox.Show(x.IdentifierAsString.ToString()); 
      } 

ответ

1

Вы можете использовать NAudio WaveFileReader исследовать дополнительные куски. Вот какой код для куба smpl:

var wavFilePath = @"E:\Recording\sfz\Equinox Steinway D\SteinwayDmA#0.wav"; 
using (var reader = new WaveFileReader(wavFilePath)) 
{ 
    var smp = reader.ExtraChunks.FirstOrDefault(ec => ec.IdentifierAsString == "smpl"); 
    if (smp != null) 
    { 
     var chunkData = reader.GetChunkData(smp); 
     // https://sites.google.com/site/musicgapi/technical-documents/wav-file-format#smpl 
     var midiNote = BitConverter.ToInt32(chunkData,12); 
     var numberOfSamples = BitConverter.ToInt32(chunkData,28); 
     Console.WriteLine($"MIDI {midiNote}, {numberOfSamples} samples"); 
     int offset = 36; 
     for (int n = 0; n < numberOfSamples; n++) 
     { 
      var cuePointId = BitConverter.ToInt32(chunkData,offset); 
      var type = BitConverter.ToInt32(chunkData, offset + 4); // 0 = loop forward, 1 = alternating loop, 2 = reverse 

      var start = BitConverter.ToInt32(chunkData, offset + 8); 
      var end = BitConverter.ToInt32(chunkData, offset + 12); 
      var fraction = BitConverter.ToInt32(chunkData, offset + 16); 
      var playCount = BitConverter.ToInt32(chunkData, offset + 20); 
      Console.WriteLine($"Sample {cuePointId} Start {start} End {end}"); 
      offset+= 24; 
     } 
    } 
} 
+0

Спасибо за решение Mark. Проверяя код на нескольких файлах Wav, я понял, что некоторые из моих Wav-файлов не имеют SMPL-фрагмента, даже если у них есть петлевые точки при загрузке в сэмплер (Bitwig/FL Studio). Я использовал _for loop_ и ** IdentifierAsString ** для итерации по набору кусков и только нашел ** "inst" **? Можно ли поставить точки петли в другой кусок? – user3441364

+0

Конечно, есть много способов, которые точки цикла могут храниться в куске. Например, петли ACID имеют свой собственный формат фрагмента. Вам нужно будет сделать некоторые исследования/обратную инженерию, чтобы узнать, что находится внутри куска inst –