饥荒联机吧 关注:160,470贴子:2,626,228

也许是一个贝壳钟小教程

取消只看楼主收藏回复

大家好,希望之花和熬夜加班对线了一年多,最近终于打赢了复活赛,过去软糯的我,堂堂复活!
其实是近期闲着无聊玩一下贝壳钟音乐,打算开个贴稍微分享下经验


IP属地:广东来自Android客户端1楼2024-08-05 21:11回复
    关于贝壳钟,最基本的一些知识再简要复读一下,贝壳钟只有C3到B5的音域,三个八度分别对应低音、中音及高音三种预制物,每种贝壳钟的十二个不同的音高对应十二平均律的各个半音,每敲一下升高一个半音,到顶了就从头循环,等等等等。这些其他人都介绍了千八百遍了,这里就不多讲了。
    不过这里要说一个有趣的点,官方的文件中,贝壳钟的声音事件sea_sound_x_lp是由两个音频合成的,一个Shells_v5_notes代表对应音高的基音(类似于女工的音色),还有一个Shells_v5_FX是额外添加特效音,而这个FX才是噪声的根源。不知道为什么要特意加上这个,可能是科雷觉得空塑料瓶敲铁皮广告牌的声音比较有饥荒味(?)


    IP属地:广东来自Android客户端2楼2024-08-05 21:12
    回复
      好的,基于以上机制,如果只是想摆些单音旋律,贝壳钟大概是够用的,但如果需要再进阶一点,基本上你能找到的所有带和弦的五线谱都会超出贝壳钟的有效范围,因此需要进行适配性编排,确保所有音都在C3到B5的范围内。如果你有一点点乐理基础,应该对这种编曲会有些帮助。
      我们这里就默认你已经有合适的谱子,或者已经知道应该怎么编曲了,接下来就从(一)手动摆放、(二)官方指令生成及(三)MIDI文件转换三个方面,讲一下摆贝壳钟的基本思路。


      IP属地:广东来自Android客户端3楼2024-08-05 21:13
      回复
        一、手动摆放
        0.前置模组
        这里首先要推荐一个本地mod,Geometric Drop,id=2431691504,这个mod可以把物品放置在固定位置,本贴的手动摆放基本都是基于这个实现的。
        另外round display这个mod有显示人物当前坐标的功能,也是非常推荐。


        IP属地:广东来自Android客户端4楼2024-08-05 21:14
        回复
          1.关于横向摆放
          横向摆放主要是控制不同音轨间的位置关系。首先我们要知道一点,贝壳钟在进入玩家4距离范围时就会触发。可以把贝壳钟音乐理解为一种很新的下落式音游,人物周围有一个半径为4的半圆形判定线,贝壳接触到图中这个圈就会发出声音,如图所示。


          IP属地:广东来自Android客户端5楼2024-08-05 21:15
          回复
            所以这里就有个误区,在摆放超过两个音轨时,很多朋友为了省事都喜欢把贝壳钟并排摆放。因为刚才讲到,人物靠近贝壳钟时的判定线是个半圆,这么做会导致同一个和弦的贝壳无法同时触发,从而出现类似于琶音的效果。这样对于一些抒情歌可能效果还不错,但如果是比较快的曲子(像六兆年这种),就不太合适了。
            图里这个就是三音轨的场景,贝壳不是一起触发的


            IP属地:广东来自Android客户端7楼2024-08-05 21:16
            回复
              综上,理想的多轨贝壳钟在横向摆放时应该是有弧度的。一般地,每一轨的贝壳间距为1是比较理想的选择,使用该方案最多可以支持七到八个音轨,且每一条线的贝壳之间不会相互重叠干扰。这里我以七轨为例简单画了个示意图,以人物所处位置为原点,可以摆放贝壳的七个点位。当然了,手动肯定摆不了这么精确,差不多就行。
              或者摆好之后用控制台代码挪位置也可以,思路是筛选全部x或z坐标相同的贝壳(取决于你的摆放方向),然后执行移位操作。


              IP属地:广东来自Android客户端8楼2024-08-05 21:17
              回复
                补一下七轨的效果图


                IP属地:广东来自Android客户端9楼2024-08-05 21:18
                回复
                  如果需要更多音轨,可以考虑如下的15轨方案,差不多是这个效果。但这么搞太密了,音轨之间相互重叠,所以手摆并不现实,如果是用文件批量生成的话倒是可以考虑,像图里这个就是用midi生成的。



                  IP属地:广东来自Android客户端10楼2024-08-05 21:19
                  回复
                    2.纵向摆放
                    说完了横向摆放方法,再来讲一下纵向的。纵向摆放主要考虑单个音轨内各音符的位置关系,为了方便进行小节定位及后期维护,我们需要确定一个单位距离作为基准。一般来讲,4墙格作为1拍是比较能够兼顾适配性和地图实际尺寸的选择,即一个四分音符为4距离,一个八分音符为2,十六分音符为1,这样的话针对4/4拍子,4格地皮为1小节,2/4拍子则2格地皮为1小节,以此类推。由于mod完全能够支持0.5的放置间距,即使是考虑到三十二分音符、琶音和修饰音也是完全够用的。就算你看不懂乐谱,按照这个原则摆放也没问题,除非你参考的谱上标注了swing或shuffle等节奏型。
                    这样的好处在于音符的排布非常规整,以4/4拍为例,以起始点为中心,往前移动4n个地皮,就能够快速定位到第n个小节。
                    这个功能可以用控制台来实现,例如假设原点为(x,z),z轴正向为贝壳钟摆放的正方向,使用指令:c_teleport(x,0,z+4*4*n)传送到对应小节的起始位置。


                    IP属地:广东来自Android客户端11楼2024-08-05 21:20
                    回复
                      3.曲速控制
                      饥荒人物默认的移动速度是6距离每秒(猴子除外),等同于每分钟移动360距离。也就是说人物无加速的情况下,如果按照上文的描述,定义4距离为1拍,则无加速的默认曲速为360÷4=90bpm。想要精确修改曲速,可以使用控制台c_speedmult()指令。
                      例如,Ave Mujica这首曲子的曲速为222bpm,只需要在做好贝壳钟之后控制台输入c_speedmult(222/90)即可。


                      IP属地:广东来自Android客户端12楼2024-08-05 21:20
                      回复
                        二、代码生成
                        如果你并不喜欢手动一个一个摆,可以尝试写文件来批量生成,官方有现成的文件和指令,但是这个玩意用起来真的没省多少工作量


                        IP属地:广东来自Android客户端13楼2024-08-05 21:21
                        回复
                          第一个指令:c_shellsfromtable(song, startpos, placementfn, spacing_multiplier, out_of_range_mode)
                          其中各参数的定义及用法如下:
                          1.song是音符文件名称,如果song未提供或不是表类型,则打印错误并返回。游戏里默认的文件是自带的主题音乐notetable_dsmaintheme.lua,如果需要替换则改为你自己的文件名即可;
                          2.startpos贝壳钟的起始坐标,默认是鼠标位置,当然也可以手填坐标;
                          3.placementfn贝壳钟的朝向,默认是按照x轴正向的;
                          4.spacing_multiplier间距参数,调整这个可以改变贝壳生成的间隔,默认是1;
                          5.out_of_range_mode超出音域时的处理模式,可以选择以下四种:
                          ①AUTO_TRANSPOSE:自动移调,如果贝壳钟生成文件的音高超出C3-B5的范围,但整体音程又在三个八度内,则系统自动尝试平移到贝壳钟的范围;但是如果文件中的整体音程超过三个八度,使用该模式会直接报错并返回。
                          ②OMIT:自动省略,如果遇到超出范围的音符,则打印警告消息,并忽略该shell的生成,并不影响其他贝壳。
                          ③TRUNCATE:出错时截断。如果遇到超出范围的音符,则从该音符开始停止生成,之前的音符仍然会被生成并返回。
                          ④TERMINATE:一旦遇到超出范围的音符,就会立即停止生成并清除所有已生成的全部贝壳。
                          在这个指令中,处理模式默认是AUTO_TRANSPOSE。


                          IP属地:广东来自Android客户端14楼2024-08-05 21:22
                          回复
                            接下来我们看一下官方给出的文件。图1表中有两个元素,第一项note代表标准midi文件中的音高,饥荒官方文件中贝壳钟能够演奏的默认范围是37-72,对应C3至B5三个八度,第二项代表贝壳钟生成时的相对坐标,即指定生成方向后,发出这个音的贝壳钟与生成原点的直线距离。所有的曲子都可以按照这个原则进行编写,为了防止出错,可以每个小节使用注释进行标记,如图2所示



                            IP属地:广东来自Android客户端15楼2024-08-05 21:23
                            回复
                              第二个指令:c_guitartab(songdata, overrides, dont_spawn_shells)
                              这个函数c_guitartab用于处理和转换吉他谱数据,以及可选地根据这些数据生成“shells”
                              1.songdata是音符文件名称,默认使用"guitartab_dsmaintheme"作为文件名。
                              2.overrides可以设置每一根弦的音高,默认是吉他的EADGBE定音
                              3.dont_spawn_shells可以设置贝壳是否生成
                              再来看一下官方给出的文件,与shellsfromtable不同,这个格式的第一项是标准吉他调音(EADGBE)下的六线谱指法,第二项是这个和弦与前一个和弦的相对时长。如果你恰好会弹吉他的话,可以试试用这个来快速编排和弦。
                              我试了,好难用


                              IP属地:广东来自Android客户端16楼2024-08-05 21:24
                              回复