搜索

iVocaloid论坛

查看: 4384|回复: 8
打印 上一主题 下一主题

【DDB】写了个初步的拆DDB工具 [复制链接]

Sleepwalking

我不是技术宅!

Lv.5-章鱼须

Rank: 5Rank: 5Rank: 5

0
9
0


UID: 111156
权限: 40
属性: 宇宙人
发帖: 201 (1精)
积分: 540
章鱼: 3
大葱: 14
茄子: 2688
注册:2012/8/18
存在感:476
跳转到指定楼层
[1L]楼主
Zleepwalking 发表于 2013/6/10 12:08:58 |只看该作者 |倒序浏览
本帖最后由 Zleepwalking 于 2013/6/10 12:11 编辑

QQ截图20130610120305.png
如图,一个简单的小工具。只是把FRM2和SND拆出来而已,ENV包含在拆出的FRM2里。。。
理论上拆出来的东西还能拼回一个DDB,虽然拆了再拼也没啥意义= =

疾风月影说他想分析洛天依的发音表,于是托我写了这么一个坑货。。。会输出好几万个文件。。。所以最好有点心里准备。。。你要有4.08G大的硬盘空间(用来拆洛天依),点下开始提取后你的CPU风扇会狂转,然后硬盘咯吱咯吱地响,如果是固态硬盘的话你可以买块新的了= =【我开玩笑的。。。

短期内就两个应用价值,一个是前面提到的研究中文连续音发音表,另一个是(或许能)制造出DDB文件暴力压缩工具。。。

http://pan.baidu.com/share/link?shareid=1261087320&uk=3423845838

源代码很短:
'
' Created by SharpDevelop.
' Sleepwalking
'
'
Imports System.IO
Public Partial Class MainForm
    Private DDBAddr As String
    Private OutputAddr As String
    Private DDBStream As FileStream
    Private DDBReader As BinaryReader
    Private WriterStream As FileStream
    Private Writer As BinaryWriter
   
    Private MemoryBuffer(1024 * 1024 * 5) As Byte '5MB
    Private MemoryBufferStream As MemoryStream = New MemoryStream(MemoryBuffer)
    Private MemoryWriter As BinaryWriter = New BinaryWriter(MemoryBufferStream)
   
    Public Sub New()
        Me.InitializeComponent()
    End Sub
   
    Sub Button1Click(sender As Object, e As EventArgs)
        openFileDialog1.ShowDialog()
        DDBAddr = openFileDialog1.FileName
    End Sub
   
    Sub Button2Click(sender As Object, e As EventArgs)
        folderBrowserDialog1.ShowDialog()
        OutputAddr = folderBrowserDialog1.SelectedPath
    End Sub
   
    Sub Button3Click(sender As Object, e As EventArgs)
        Dim TrunkIdntfyr(3) As Char
        Dim TrunkLen As Integer
        Dim TrunkAudioSRate As Integer
        Dim TrunkAudioChannel As Int16
        Dim TrunkBeginPosition As Long
        Dim Count_FRM2 As Integer = 0
        Dim Count_SND As Integer = 0
        
        Directory.CreateDirectory(OutputAddr & "FRM2\")
        Directory.CreateDirectory(OutputAddr & "SND\")
        DDBStream = New FileStream(DDBAddr, FileMode.Open)
        DDBReader = New BinaryReader(DDBStream)
        While DDBStream.Position < DDBStream.Length
            progressBar1.Value = CInt(TrunkBeginPosition/ DDBStream.Length * 100)
            TrunkBeginPosition = DDBStream.Position
            TrunkIdntfyr = DDBReader.ReadChars(4)
            TrunkLen = DDBReader.ReadInt32()
            Select Case TrunkIdntfyr
                Case "FRM2"
                    Count_FRM2 += 1
                    If CheckBox_OutputFRM2.Checked Then
                        MemoryBufferStream.Position = 0
                        MemoryWriter.Write(TrunkIdntfyr)
                        MemoryWriter.Write(TrunkLen)
                        MemoryWriter.Write(DDBReader.ReadBytes(TrunkLen - 8))
                        If RadioButton_Address.Checked Then
                            WriterStream = New FileStream(OutputAddr & "FRM2\" & "FRM2_" & TrunkBeginPosition.ToString("X") & ".frm2", FileMode.Create)
                        Else
                            WriterStream = New FileStream(OutputAddr & "FRM2\" & "FRM2_" & Count_FRM2 & ".frm2", FileMode.Create)   
                        End If
                        WriterStream.Write(MemoryBuffer, 0, CInt(MemoryBufferStream.Position))
                        WriterStream.Close()
                    Else
                        DDBStream.Position += TrunkLen - 8
                    End If
                Case "SND "
                    Count_SND += 1
                    TrunkAudioSRate = DDBReader.ReadInt32()
                    TrunkAudioChannel = DDBReader.ReadInt16()
                    MemoryBufferStream.Position = 0
                    MemoryWriter.Write(TrunkIdntfyr)
                    MemoryWriter.Write(TrunkLen)
                    MemoryWriter.Write(TrunkAudioSRate)
                    MemoryWriter.Write(TrunkAudioChannel)
                    MemoryWriter.Write(DDBReader.ReadBytes(TrunkLen - 14))
                    If RadioButton_Address.Checked Then
                        WriterStream = New FileStream(OutputAddr &  "SND\" & "SND_" & TrunkBeginPosition.ToString("X") & ".snd", FileMode.Create)
                    Else
                        WriterStream = New FileStream(OutputAddr &  "SND\" & "SND_" & Count_SND & ".snd", FileMode.Create)
                    End If
                    WriterStream.Write(MemoryBuffer, 0, CInt(MemoryBufferStream.Position))
                    WriterStream.Close()
            End Select
        End While
    End Sub
End Class

知识共享许可协议 除非另有声明,本帖内容采用 署名-非商业-相同方式共享 3.0 许可协议 授权,且需注明出处,所有权利归发帖人。

使用道具 举报

Rank: 3

0
3
0


UID: 93325
权限: 20
属性: 難燃性
发帖: 74 (0精)
积分: 100
章鱼: 1
大葱: 2
茄子: 433
注册:2011/10/22
存在感:84
[2L]沙发
rgwan 发表于 2013/6/10 14:03:53 |只看该作者
注意使用RAMDISK。建议别用硬盘。小心报废。

使用道具 举报

Rank: 4Rank: 4

0
23
0


UID: 104368
权限: 30
属性: 変態
发帖: 122 (0精)
积分: 385
章鱼: 7
大葱: 11
茄子: 1367
注册:2012/4/22
存在感:130
[3L]板凳
Tnga 发表于 2015/1/2 14:48:34 |只看该作者
Sleepwalking你知道么...其实3年前有前辈写过类似东西....不过我一直用不了(输出全是同一个元音)
继续支持LZ事业

使用道具 举报

Rank: 2Rank: 2

0
3
0


UID: 158909
权限: 10
属性: 不明
发帖: 6 (0精)
积分: 22
章鱼: 0
大葱: 2
茄子: 194
注册:2017/9/24
存在感:36
[4L]地板
Ehobits 发表于 2017/9/25 08:29:51 |只看该作者
连接挂了希望楼主补发,正好需要这么个东西

使用道具 举报

Rank: 2Rank: 2

0
1
0


UID: 158348
权限: 10
属性: 不明
发帖: 9 (0精)
积分: 17
章鱼: 0
大葱: 1
茄子: 98
注册:2017/9/9
存在感:41
[5L]萝莉
Mux 发表于 2017/12/2 20:22:42 |只看该作者
Ehobits 发表于 2017/9/25 08:29
连接挂了希望楼主补发,正好需要这么个东西

按照源代码我编译出来了但是。。。提取出的文件都是.snd文件千方百计没法播放的那种

使用道具 举报

Chiken_P

Lv.2-鱼仔酱

Rank: 2Rank: 2

0
0
0


UID: 161880
权限: 10
属性: 男性
发帖: 12 (0精)
积分: 14
章鱼: 0
大葱: 1
茄子: 81
注册:2018/1/8
存在感:45
Chiken_P 发表于 2018/1/13 19:57:11 |只看该作者
链接挂了AAAAAA求补

使用道具 举报

Rank: 2Rank: 2

0
3
0


UID: 173502
权限: 10
属性: 不明
发帖: 11 (0精)
积分: 20
章鱼: 0
大葱: 1
茄子: 112
注册:2018/12/14
存在感:174
[7L]大姐姐
Filo97 发表于 2019/2/3 03:34:54 |只看该作者
是否有可能重新上载?

使用道具 举报

小白菌

Lv.3-章鱼烧

Rank: 3

0
0
0


UID: 159726
权限: 20
属性: 男性
发帖: 66 (0精)
积分: 59
章鱼: 0
大葱: 1
茄子: 465
注册:2017/10/17
存在感:199
[8L]实妹
18736639203 发表于 2020/6/24 09:35:54 |只看该作者
Mux 发表于 2017/12/2 20:22
按照源代码我编译出来了但是。。。提取出的文件都是.snd文件千方百计没法播放的那种
...

snd可以用GoldWave打开的,v声库也可以直接在里面播放,就是我一直不能单独拆出来每个音

使用道具 举报

mcst12345

Lv.2-鱼仔酱

Rank: 2Rank: 2

0
0
0


UID: 291085
权限: 10
属性: 不明
发帖: 5 (0精)
积分: 11
章鱼: 0
大葱: 1
茄子: 59
注册:2021/7/7
存在感:126
mcst12345 发表于 2022/4/28 14:52:56 |只看该作者
这个源码是什么语言的

使用道具 举报

您需要登录后才可以回帖 登录 | 注册/sign up

申请友链|Archiver|iVocaloid - 自由,开放,合作,共享    | 版权持有者点击这里进行举报

GMT+8, 2025/6/6 10:00

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部