diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c91e428 --- /dev/null +++ b/.gitignore @@ -0,0 +1,63 @@ +## A streamlined .gitignore for modern .NET projects +## including temporary files, build results, and +## files generated by popular .NET tools. If you are +## developing with Visual Studio, the VS .gitignore +## https://github.com/github/gitignore/blob/main/VisualStudio.gitignore +## has more thorough IDE-specific entries. +## +## Get latest from https://github.com/github/gitignore/blob/main/Dotnet.gitignore + +# Rider +.idea/ + +#macOS +.DS_Store + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Ww][Ii][Nn]32/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# ASP.NET Scaffolding +ScaffoldingReadMe.txt + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg + +# dotenv environment variables file +.env + +# Others +~$* +*~ +CodeCoverage/ + +# MSBuild Binary and Structured Log +*.binlog + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml diff --git a/README.md b/README.md index 4dde303..f6e41ef 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ # Resonance +每一位声音设计师都值得拥有一个好用的资产管理器。 + 助你快速将脑子里的动静转换成DAW里的波形。 ## 技术栈 -.NET + Avaloina + Ffmpeg +.NET + Avaloina + SQLite ## Roadmap diff --git a/data/SoundMiner/Boom.sqlite b/data/SoundMiner/Boom.sqlite new file mode 100644 index 0000000..11c15ce Binary files /dev/null and b/data/SoundMiner/Boom.sqlite differ diff --git a/data/SoundMiner/Dialog.sqlite b/data/SoundMiner/Dialog.sqlite new file mode 100644 index 0000000..0b410cf Binary files /dev/null and b/data/SoundMiner/Dialog.sqlite differ diff --git a/data/SoundMiner/Music.sqlite b/data/SoundMiner/Music.sqlite new file mode 100644 index 0000000..6a8b9e8 Binary files /dev/null and b/data/SoundMiner/Music.sqlite differ diff --git a/data/basehead.xlsx b/data/basehead.xlsx new file mode 100644 index 0000000..fb27ec6 Binary files /dev/null and b/data/basehead.xlsx differ diff --git a/data/表结构分析.md b/data/表结构分析.md new file mode 100644 index 0000000..8fd0ddf --- /dev/null +++ b/data/表结构分析.md @@ -0,0 +1,191 @@ +让我整理一下这些字段的含义: + +1. id - 主键ID +2. path - 原始导入路径 +3. filename - 带扩展名的文件名 +4. description - 文件自带描述 +5. length - 音频长度(时长) +6. bit_depth - 位深度(如16bit, 24bit) +7. channels - 声道数(单声道/立体声/环绕声) +8. date_added - 导入日期 +9. sample_rate - 采样率(如44.1kHz, 48kHz) +10. type - 文件类型(如WAV, MP3, AIFF等) +11. cd_title - CD标题 +12. artist - 艺术家 +13. coding_history - 编码历史 +14. original_date - 原始日期 +15. originator_ref - 来源引用 +16. originator - 来源/创作者 +17. timecode - 时间码 +18. subcategory - 子分类 +19. category - 分类 +20. comments - 注释 +21. episode - 剧集/集数 +22. frame_rate - 帧率 +23. group - 分组 +24. library - 音频库 +25. location - 位置/地点 +26. project_name - 项目名称 +27. rating - 评分 +28. tape - 磁带 +29. scene - 场景 +30. sync_point - 同步点 +31. take - 录音条次 +32. track_title - 曲目标题 +33. composer - 作曲家 +34. designer - 设计师 +35. publisher - 出版商 +36. folder - 文件夹 +37. genre - 流派/风格 +38. keywords - 关键词 +39. copyright - 版权 +40. recordist - 录音师 +41. manufacturer - 制造商 +42. notes - 备注 +43. microphone - 麦克风 +44. directory - 目录 +45. origination_time - 创建时间 +46. unique_id - 唯一标识符 +47. bpm - 每分钟节拍数 +48. mood - 情绪/氛围 +49. short_id - 短ID +50. cue_number - 提示号 +51. style - 风格 +52. markers - 标记点 +53. is_edited - 是否已编辑 +54. is_split - 是否已分割 + 55-62. user1-user8 - 用户自定义字段 + +我会为用户提供一个详细的分析报告。 + +我来为您分析这个音频管理软件的表结构。根据字段名称和数据类型,这是一个专业的**音频资产管理系统**的数据库结构,类似于 SoundMiner、BaseHead 等专业音频库管理软件。 + +## 字段含义分析 + +### 📌 基础标识字段 + + + +| 字段名 | 类型 | 含义说明 | +| ----------- | ------- | ---------------------------------------------- | +| `id` | integer | **主键ID**,音频文件的唯一数字标识符 | +| `unique_id` | text | **全局唯一标识符**,通常为UUID,用于跨系统识别 | +| `short_id` | text | **短ID**,便于人工识别或显示的简短标识 | + +### 📁 文件存储字段 + + + +| 字段名 | 类型 | 含义说明 | +| ----------- | ---- | ---------------------------------------------------- | +| `path` | text | **原始导入路径**,音频文件被导入时的完整文件路径 | +| `filename` | text | **文件名**,包含扩展名的音频文件名称(如 sound.wav) | +| `folder` | text | **文件夹**,文件所在的文件夹名称 | +| `directory` | text | **目录**,文件的存储目录路径 | + +### 🎵 音频技术参数 + + + +| 字段名 | 类型 | 含义说明 | +| ------------- | ------- | -------------------------------------------------------- | +| `length` | real | **时长**,音频文件的播放长度(通常以秒为单位) | +| `bit_depth` | integer | **位深度**,音频采样位深(如 16、24、32 bit) | +| `channels` | integer | **声道数**,如 1=单声道、2=立体声、6=5.1环绕声 | +| `sample_rate` | integer | **采样率**,如 44100、48000、96000 Hz | +| `type` | text | **文件类型**,音频格式(WAV、MP3、AIFF、FLAC等) | +| `bpm` | real | **节拍速度**,每分钟节拍数,用于音乐类音频 | +| `frame_rate` | text | **帧率**,视频同步用的时间基准(如 24fps、25fps、30fps) | +| `timecode` | integer | **时间码**,用于音视频同步的时间戳信息 | + +### 📝 元数据描述字段 + + + +| 字段名 | 类型 | 含义说明 | +| ------------- | ------------ | ---------------------------------------------------- | +| `description` | text | **描述**,音频内容的文字说明 | +| `category` | text | **分类**,音频的大类(如:音效、音乐、对白、环境音) | +| `subcategory` | text | **子分类**,更细分的类别(如:交通→汽车→引擎) | +| `genre` | text | **流派**,音乐风格分类(如:摇滚、古典、电子) | +| `style` | text | **风格**,更具体的风格描述 | +| `mood` | text | **情绪**,音频传达的情感氛围(如:紧张、欢快、悲伤) | +| `keywords` | text | **关键词**,用于搜索的标签,多个关键词通常用逗号分隔 | +| `rating` | decimal(5.3) | **评分**,音频质量或推荐度评分(如 0-5星) | + +### 👤 创作者信息字段 + + + +| 字段名 | 类型 | 含义说明 | +| ---------------- | ---- | -------------------------------- | +| `artist` | text | **艺术家**,表演者或演奏者名称 | +| `composer` | text | **作曲家**,音乐创作者 | +| `designer` | text | **设计师**,音效设计师名称 | +| `recordist` | text | **录音师**,现场录音人员 | +| `publisher` | text | **出版商**,发行方或版权持有方 | +| `manufacturer` | text | **制造商**,音频库或设备的制作方 | +| `originator` | text | **来源方**,原始创建者或来源机构 | +| `originator_ref` | text | **来源引用**,原始来源的参考编号 | + +### 🎬 项目制作字段 + + + +| 字段名 | 类型 | 含义说明 | +| -------------- | ------- | -------------------------------------- | +| `project_name` | text | **项目名称**,所属制作项目 | +| `library` | text | **音频库**,所属音效库或音乐库的名称 | +| `cd_title` | text | **CD标题**,原始CD专辑名称 | +| `track_title` | text | **曲目标题**,音乐或音轨的标题 | +| `episode` | text | **剧集**,所属剧集或系列编号 | +| `scene` | text | **场景**,对应的影视场景标识 | +| `take` | text | **条次**,录音的版本号或拍摄条次 | +| `tape` | text | **磁带**,原始磁带编号(历史遗留字段) | +| `cue_number` | integer | **提示号**,播放列表或乐谱中的编号 | +| `sync_point` | integer | **同步点**,用于音视频同步的参考点 | + +### 📋 管理与状态字段 + + + +| 字段名 | 类型 | 含义说明 | +| ------------------ | ------- | -------------------------------------------------- | +| `date_added` | date | **导入日期**,音频入库的时间 | +| `original_date` | text | **原始日期**,音频创建或录制的日期 | +| `origination_time` | text | **创建时间**,音频文件的原始创建时间 | +| `is_edited` | integer | **是否已编辑**,布尔值(0=否,1=是) | +| `is_split` | integer | **是否已分割**,布尔值,标记是否从长文件中分割出来 | +| `location` | text | **位置**,录音地点或存储位置 | +| `group` | text | **分组**,用于组织管理的分组标识 | +| `markers` | text | **标记点**,音频内的关键时间点标记 | + +### 📄 备注与版权字段 + + + +| 字段名 | 类型 | 含义说明 | +| ---------------- | ---- | -------------------------------------- | +| `comments` | text | **注释**,用户或系统添加的备注 | +| `notes` | text | **备注**,额外的说明信息 | +| `copyright` | text | **版权**,版权声明信息 | +| `coding_history` | text | **编码历史**,BWF格式的编码历史记录 | +| `microphone` | text | **麦克风**,录音使用的麦克风型号或设置 | + +### 🔧 用户自定义字段 + + + +| 字段名 | 类型 | 含义说明 | +| ----------------- | ---- | ------------------------------------------------------------ | +| `user1` ~ `user8` | text | **用户自定义字段**,共8个预留字段,供用户根据实际需求自定义用途 | + +## 总结 + +这是一个**专业级音频资产管理系统**的完整表结构,主要特点: + +1. **符合广播级标准**:包含 BWF(Broadcast Wave Format)标准字段如 `coding_history`、`originator`、`timecode` 等 +2. **支持影视后期制作**:有 `scene`、`take`、`episode`、`sync_point` 等影视制作相关字段 +3. **音乐管理功能完善**:包含 `bpm`、`mood`、`genre`、`composer` 等音乐元数据 +4. **灵活扩展性**:预留了8个用户自定义字段 +5. **版权管理支持**:包含 `copyright`、`publisher`、`manufacturer` 等版权相关字段 \ No newline at end of file diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj new file mode 100644 index 0000000..62178bc --- /dev/null +++ b/src/Core/Core.csproj @@ -0,0 +1,14 @@ + + + + net10.0 + enable + enable + + + + + + + + diff --git a/src/Core/FileMeta.cs b/src/Core/FileMeta.cs new file mode 100644 index 0000000..9be6747 --- /dev/null +++ b/src/Core/FileMeta.cs @@ -0,0 +1,211 @@ +namespace OCES.Resonance.Core; + +/// +/// 音频文件元数据实体类,对应音频资产管理系统中的文件记录 +/// +public class FileMeta +{ + /// 主键ID,音频文件的唯一数字标识符 + public int Id { get; set; } + + /// 全局唯一标识符,通常为UUID,用于跨系统识别 + public string UniqueId { get; set; } + + /// 文件的MD5值,用于查重 + public string Md5 { get; set; } + + /// 短ID,便于人工识别或显示的简短标识 + public string? ShortId { get; set; } + + /// 原始导入路径,音频文件被导入时的完整文件路径 + public string Path { get; set; } + + /// 文件名,包含扩展名的音频文件名称(如 sound.wav) + public string Filename { get; set; } + + /// 文件夹,文件所在的文件夹名称 + public string Folder { get; set; } + + /// 目录,文件的存储目录路径 + public string Directory { get; set; } + + /// 时长,音频文件的播放长度(通常以秒为单位) + public double Duration { get; set; } + + public int TotalSamples { get; set; } + + /// 位深度,音频采样位深(如 16、24、32 bit) + public int BitDepth { get; set; } + + /// 声道数,如 1=单声道、2=立体声、6=5.1环绕声 + public int Channels { get; set; } + + /// 采样率,如 44100、48000、96000 Hz + public int SampleRate { get; set; } + + /// 文件类型,音频格式(WAV、MP3、AIFF、FLAC等) + public string Type { get; set; } + + /// 节拍速度,每分钟节拍数,用于音乐类音频 + public double? Bpm { get; set; } + + /// 帧率,视频同步用的时间基准(如 24fps、25fps、30fps) + public string? FrameRate { get; set; } + + /// 时间码,用于音视频同步的时间戳信息 + public int? Timecode { get; set; } + + /// 描述,音频内容的文字说明 + public string? Description { get; set; } + + /// 分类,音频的大类(如:音效、音乐、对白、环境音) + public string? Category { get; set; } + + /// 子分类,更细分的类别(如:交通→汽车→引擎) + public string? Subcategory { get; set; } + + /// CatId + public string? CatId { get; set; } + + public string? CategoryFull { get; set; } + + /// 流派,音乐风格分类(如:摇滚、古典、电子) + public string? Genre { get; set; } + + /// 风格,更具体的风格描述 + public string? Style { get; set; } + + /// 情绪,音频传达的情感氛围(如:紧张、欢快、悲伤) + public string? Mood { get; set; } + + /// 关键词,用于搜索的标签,多个关键词通常用逗号分隔 + public string? Keywords { get; set; } + + /// 评分,音频质量或推荐度评分(如 0-5星) + public decimal? Rating { get; set; } + + /// 艺术家,表演者或演奏者名称 + public string? Artist { get; set; } + + /// 作曲家,音乐创作者 + public string? Composer { get; set; } + + /// 设计师,音效设计师名称 + public string? Designer { get; set; } + + /// 录音师,现场录音人员 + public string? Recordist { get; set; } + + /// 出版商,发行方或版权持有方 + public string? Publisher { get; set; } + + /// 制造商,音频库或设备的制作方 + public string? Manufacturer { get; set; } + + /// 来源方,原始创建者或来源机构 + public string? Originator { get; set; } + + /// 来源引用,原始来源的参考编号 + public string? OriginatorRef { get; set; } + + /// 项目名称,所属制作项目 + public string? ProjectName { get; set; } + + /// 音频库,所属音效库或音乐库的名称 + public string? Library { get; set; } + + /// CD标题,原始CD专辑名称 + public string? CdTitle { get; set; } + + /// 曲目标题,音乐或音轨的标题 + public string? TrackTitle { get; set; } + + /// 剧集,所属剧集或系列编号 + public string? Episode { get; set; } + + /// 场景,对应的影视场景标识 + public string? Scene { get; set; } + + /// 条次,录音的版本号或拍摄条次 + public string? Take { get; set; } + + /// 磁带,原始磁带编号(历史遗留字段) + public string? Tape { get; set; } + + /// 提示号,播放列表或乐谱中的编号 + public int? CueNumber { get; set; } + + /// 同步点,用于音视频同步的参考点 + public int? SyncPoint { get; set; } + + /// 导入日期,音频入库的时间 + public DateTime DateAdded { get; set; } + + /// 修改日期,音频创建或录制的日期 + public DateTime OriginalModificationDate { get; set; } + + /// 创建时间,音频文件的原始创建时间 + public DateTime OriginationTime { get; set; } + + public DateTime? ReleaseDate { get; set; } + + public string? TrackYear { get; set; } + + /// 是否已编辑,布尔值(0=否,1=是) + public bool? IsEdited { get; set; } + + /// 是否已分割,布尔值,标记是否从长文件中分割出来 + public int? IsSplit { get; set; } + + /// 位置,录音地点或存储位置 + public string? Location { get; set; } + + /// 分组,用于组织管理的分组标识 + public string? Group { get; set; } + + /// 标记点,音频内的关键时间点标记 + public string? Markers { get; set; } + + /// 注释,用户或系统添加的备注 + public string? Comments { get; set; } + + /// 备注,额外的说明信息 + public string? Notes { get; set; } + + /// 版权,版权声明信息 + public string? Copyright { get; set; } + + /// 编码历史,BWF格式的编码历史记录 + public string? CodingHistory { get; set; } + + /// 麦克风,录音使用的麦克风型号或设置 + public string? Microphone { get; set; } + + public string? MicPerspective { get; set; } + + // 用户自定义字段(共8个) + + /// 用户自定义字段1 + public string? User1 { get; set; } + + /// 用户自定义字段2 + public string? User2 { get; set; } + + /// 用户自定义字段3 + public string? User3 { get; set; } + + /// 用户自定义字段4 + public string? User4 { get; set; } + + /// 用户自定义字段5 + public string? User5 { get; set; } + + /// 用户自定义字段6 + public string? User6 { get; set; } + + /// 用户自定义字段7 + public string? User7 { get; set; } + + /// 用户自定义字段8 + public string? User8 { get; set; } +} diff --git a/src/Resonance.sln b/src/Resonance.sln new file mode 100644 index 0000000..d559589 --- /dev/null +++ b/src/Resonance.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core", "Core\Core.csproj", "{855F941D-5DA0-479A-BB79-5C7CE72CD34B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {855F941D-5DA0-479A-BB79-5C7CE72CD34B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {855F941D-5DA0-479A-BB79-5C7CE72CD34B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {855F941D-5DA0-479A-BB79-5C7CE72CD34B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {855F941D-5DA0-479A-BB79-5C7CE72CD34B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/src/Resonance.sln.DotSettings b/src/Resonance.sln.DotSettings new file mode 100644 index 0000000..0bf801c --- /dev/null +++ b/src/Resonance.sln.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file