کتابخانه‌ی استاندارد · کدگذاری و داده

صدا/میدی audio/midi

خواندن، نوشتن و نواختن پرونده‌های میدی استاندارد.

واردسازی audio.midi

پرونده میدی نت نگه می‌دارد نه صدا: کدام نت، کی، چه اندازه سخت و با چه سازی. همین آن را کوچک می‌کند، و ویرایش‌پذیرش می‌کند به شکلی که یک ضبط نیست.

این بسته پرونده‌های میدی استاندارد را می‌خواند و می‌نویسد، و ساختن یکی را از راه صدا.صداساز به صدا برمی‌گرداند، پس پرونده‌ای از نت‌ها به قطعهای می‌شود که می‌توانید به شکل ویو یا فلاک ذخیره کنید.

دانستنی‌ها

  • همه چیز به تیک است، و تقسیم می‌گوید یک چهارم چند تیک است. تیک به ثانیه ضرباهنگ را هم می‌خواهد، و برای همین همه آهنگ را می‌گیرد.
  • یک نت دو رویداد است، روشن و خاموش. افزودن نت هر دو را می‌نویسد، و نت‌ها آنها را باز جفت می‌کند و درازی‌ها را به ثانیه به شما می‌دهد.
  • نت روشن با شدت صفر یعنی نت خاموش، و خواننده آن را به یکی برمی‌گرداند تا هرگز ناچار به سنجیدن نباشید.
  • آهنگ را با آزادسازی آهنگ رها کنید: برای هر ترک یک وکتور و خود وکتور ترک‌ها از آن است.
  • ساختن برای هر نت یک پوشش ساده به کار می‌برد. برای هر چیز بیشتر، نت‌ها را بگیرید و خودتان بسازید.

گونه‌ها

رویداد Event

ساختار رویداد
یک رویداد میدی، با تیکی که در آن رخ می‌دهد.
نامانگلیسیگونهتوضیح
تیکtickصحیح = 0کی رخ می‌دهد، به تیک از آغاز.
وضعیتstatusصحیح = 0از چه گونه رویدادی است.
کانالchannelصحیح = 0بر کدام یک از شانزده کانال است.
داده۱data1صحیح = 0بایت نخست، یک شماره نت یا یک واپایشگر.
داده۲data2صحیح = 0بایت دوم، یک شدت یا یک مقدار.
فراmetaصحیح = 0کدام رویداد فراست، وقتی وضعیت فرا را بگوید.
مقدارvalueصحیح۶۴ = 0عددی که رویداد فرا با خود دارد، مثل یک ضرباهنگ.
midi-Write.salam
واردسازی صدا.میدی
واردسازی فشرده سازی

تابع ریشه:
    ناپایا آهنگم := میدی.آهنگ جدید(480)
    سرچاپ آهنگم.تقسیم، آهنگم.قالب، آهنگم.ضرباهنگ برگردان صحیح
    سرچاپ میدی.تقسیم پیش‌فرض

    ناپایا ترکم := میدی.ترک جدید()
    میدی.افزودن ضرباهنگ(ترکم، 0، 120.0)
    میدی.افزودن برنامه(ترکم، 0، 0، 0)
    میدی.افزودن واپایش(ترکم، 0، 7، 100، 0)
    ناپایا شماره := 0
    تا شماره کوچکتر 4:
        میدی.افزودن نت(ترکم، شماره * 480، 240، 60 + شماره * 2، 100، 0)
        شماره += 1
    پایان
    سرچاپ ترکم.رویدادها.طول()
    میدی.افزودن ترک(آهنگم، ترکم)
    سرچاپ آهنگم.ترک‌ها.طول()، میدی.تیک کل(آهنگم)

    یکی := ترکم.رویدادها.بگیر(1)
    سرچاپ یکی.تیک، یکی.وضعیت برابر میدی.نت روشن، یکی.داده۱، یکی.داده۲، یکی.کانال

    سرچاپ میدی.نت روشن، میدی.نت خاموش، میدی.تغییر واپایش، میدی.تغییر برنامه، میدی.رویداد فرا

    رمزی := میدی.کدگذاری میدی(آهنگم)
    سرچاپ فشرده سازی.طول بافر(رمزی) بزرگتر 22، میدی.میدی است(رمزی.data، رمزی.len)
    ناپایا خالی := میدی.آهنگ جدید(480)
    سرچاپ فشرده سازی.طول بافر(میدی.کدگذاری میدی(خالی))
    میدی.آزادسازی آهنگ(خالی)

    فشرده سازی.آزادسازی بافر(رمزی)
    میدی.آزادسازی آهنگ(آهنگم)
پایان
خروجی480 1 500000 480 11 1 1680 0 false 0 0 0 144 128 176 192 255 true true 0

ترک Track

ساختار ترک
یک ترک: فهرستی از رویدادها به ترتیب تیک.
نامانگلیسیگونهتوضیح
رویدادهاeventsوکتور<رویداد>رویدادها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

آهنگ Song

ساختار آهنگ
یک پرونده میدی کامل: قالبش، زمان‌بندی‌اش و ترک‌هایش.
نامانگلیسیگونهتوضیح
قالبformatصحیح = 0کدام قالب اس‌ام‌اف است، صفر برای یک ترک و یک برای چند تا.
تقسیمdivisionصحیح = 0تیک در هر چهارم، که هر تیک با آن سنجیده می‌شود.
ضرباهنگtempoصحیح۶۴ = 500000میکروثانیه در هر چهارم. پانصد هزار یعنی صد و بیست ضربه در دقیقه.
ترک‌هاtracksوکتور<ترک>خود ترک‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

پایاها و متغیرها

نت خاموش NoteOff

پایا نت خاموش: صحیح۳۲ = 128
پایان یک نت. نت روشن با شدت صفر یکی از اینها خوانده می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

نت روشن NoteOn

پایا نت روشن: صحیح۳۲ = 144
آغاز یک نت.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

تغییر واپایش ControlChange

پایا تغییر واپایش: صحیح۳۲ = 176
جابجایی یک واپایشگر، مثل پدال صدا.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

تغییر برنامه ProgramChange

پایا تغییر برنامه: صحیح۳۲ = 192
عوض شدن ساز.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

شماره‌های رویداد فرا Meta…

رویداد کدام رویداد فرا را با خود دارد، وقتی وضعیتش فرا را بگوید.
نامانگلیسیمقدار
رویداد فراMetaEvent255
فرا ضرباهنگMetaTempo81
فرا نام ترکMetaTrackName3
پایان ترکMetaEndOfTrack47
فرا کسر میزانMetaTimeSignature88

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

تقسیم پیش‌فرض DefaultDivision

پایا تقسیم پیش‌فرض: صحیح۳۲ = 480
تیک در هر چهارمی که آهنگ تازه می‌گیرد، چهارصد و هشتاد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

تابع‌ها

میدی است IsMIDI

تابع میدی است(p: تهی*، n: صحیح): منطقی
درست وقتی این بایت‌ها با سرآیند MThd آغاز شوند.
midi-Read.salam
واردسازی صدا
واردسازی صدا.میدی
واردسازی فشرده سازی
واردسازی مسیر پرونده
واردسازی ریاضی
واردسازی حافظه
واردسازی سیستم عامل

تابع ریشه:
    ناپایا آهنگم := میدی.آهنگ جدید(480)
    ناپایا ترکم := میدی.ترک جدید()
    میدی.افزودن ضرباهنگ(ترکم، 0، 120.0)
    ناپایا شماره := 0
    تا شماره کوچکتر 4:
        میدی.افزودن نت(ترکم، شماره * 480، 240، 60 + شماره * 2، 100، 0)
        شماره += 1
    پایان
    میدی.افزودن ترک(آهنگم، ترکم)
    رمزی := میدی.کدگذاری میدی(آهنگم)

    سرچاپ میدی.میدی است(رمزی.data، رمزی.len)، میدی.میدی است(رمزی.data، 8)
    سرچاپ صدا.نام قالب(صدا.شناسایی قالب(رمزی.data، رمزی.len))
    ناپایا درستی := نادرست
    ناپایا برگشته := میدی.کدگشایی میدی(رمزی.data، رمزی.len، درستی)
    سرچاپ درستی، برگشته.تقسیم، برگشته.ترک‌ها.طول()
    سرچاپ ریاضی.قدرمطلق(میدی.ضربان(برگشته) - 120.0) کوچکتر 0.01
    سرچاپ میدی.تیک کل(برگشته)
    سرچاپ میدی.تیک به ثانیه(برگشته، 480)، میدی.ثانیه به تیک(برگشته، 0.5)

    ناپایا نت‌هایم := میدی.نت‌ها(برگشته)
    سرچاپ نت‌هایم.طول()، نت‌هایم.بگیر(0).شماره نت، نت‌هایم.بگیر(3).شماره نت
    سرچاپ نت‌هایم.بگیر(1).آغاز، نت‌هایم.بگیر(0).درازی
    نت‌هایم.آزادکن()

    ساخته := میدی.ساختن(برگشته، 22050، 1)
    سرچاپ ساخته.فریم ها بزرگتر 0، صدا.اوج(ساخته) بزرگتر 0.05
    سرچاپ میدی.نام برنامه(0)، میدی.نام برنامه(200) برابر ""

    نشانی := مسیر پرونده.پیوند(سیستم عامل.پوشه موقت()، "salam_midi_example.mid")
    دیرکن حافظه.آزادسازی(نشانی برگردان تهی*)
    سرچاپ میدی.ذخیره میدی(آهنگم، نشانی)
    ناپایا درستی۲ := نادرست
    ناپایا دیسکی := میدی.بازکردن میدی(نشانی، درستی۲)
    سرچاپ درستی۲، دیسکی.ترک‌ها.طول()
    ناپایا رفته := نادرست
    نبود := مسیر پرونده.پیوند(سیستم عامل.پوشه موقت()، "salam_midi_none.mid")
    دیرکن حافظه.آزادسازی(نبود برگردان تهی*)
    میدی.بازکردن میدی(نبود، رفته)
    سرچاپ رفته

    ناپایا خراب := نادرست
    میدی.کدگشایی میدی(رمزی.data، 8، خراب)
    سرچاپ خراب

    فشرده سازی.آزادسازی بافر(رمزی)
    ناپایا آر := ساخته
    صدا.آزادسازی(آر)
    میدی.آزادسازی آهنگ(آهنگم)
    میدی.آزادسازی آهنگ(برگشته)
    میدی.آزادسازی آهنگ(دیسکی)
پایان
خروجیtrue false midi true 480 1 true 1680 0.5 480 4 60 66 0.5 0.25 true true Acoustic Grand Piano true true true 1 false false

آهنگ جدید NewSong

تابع آهنگ جدید(division: صحیح): آهنگ
آهنگی خالی با تقسیمی که برمی‌گزینید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

ترک جدید NewTrack

تابع ترک جدید(): ترک
ترکی خالی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

افزودن ترک AddTrack

تابع افزودن ترک(f &: آهنگ، t: ترک)
ترکی به آهنگ می‌افزاید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

افزودن نت AddNote

تابع افزودن نت(t &: ترک، tick: صحیح، length: صحیح، note: صحیح، velocity: صحیح، channel: صحیح)
یک نت روشن و نت خاموش همتایش را می‌افزاید، که نوشتن یک نت به‌راستی همین است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

افزودن ضرباهنگ AddTempo

تابع افزودن ضرباهنگ(t &: ترک، tick: صحیح، bpm: اعشار۶۴)
تغییر ضرباهنگ به ضربه در دقیقه می‌افزاید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

افزودن برنامه AddProgram

تابع افزودن برنامه(t &: ترک، tick: صحیح، program: صحیح، channel: صحیح)
تغییر ساز می‌افزاید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

افزودن واپایش AddControl

تابع افزودن واپایش(t &: ترک، tick: صحیح، controller: صحیح، value: صحیح، channel: صحیح)
تغییر واپایشگر می‌افزاید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

آزادسازی آهنگ FreeSong

تابع آزادسازی آهنگ(f &: آهنگ)
هر ترک و رویدادی که آهنگ نگه می‌دارد را رها می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

تیک به ثانیه TicksToSeconds

تابع تیک به ثانیه(f: آهنگ، ticks: صحیح): اعشار۶۴
چند تیک در ضرباهنگ آهنگ چند ثانیه می‌پاید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Read.salam

ثانیه به تیک SecondsToTicks

تابع ثانیه به تیک(f: آهنگ، seconds: اعشار۶۴): صحیح
راه برگشت همان.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Read.salam

ضربان Bpm

تابع ضربان(f: آهنگ): اعشار۶۴
ضرباهنگ به ضربه در دقیقه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Read.salam

تیک کل TotalTicks

تابع تیک کل(f: آهنگ): صحیح
تیکی که آخرین رویداد در آن رخ می‌دهد، پس آهنگ چه اندازه دراز است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Read.salam

کدگشایی میدی DecodeMIDI

تابع کدگشایی میدی(p: تهی*، n: صحیح، ok &: منطقی): آهنگ
پرونده میدی استاندارد را می‌خواند، وضعیت روان را پی می‌گیرد و رویدادهای سامانه را می‌پرد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Read.salam

کدگذاری میدی EncodeMIDI

تابع کدگذاری میدی(f: آهنگ): compress.ByteBuf
آهنگ را به شکل پرونده میدی استاندارد بیرون می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

بازکردن میدی OpenMIDI

تابع بازکردن میدی(path: رشته، ok &: منطقی): آهنگ
پرونده میدی را از دیسک می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Read.salam

ذخیره میدی SaveMIDI

تابع ذخیره میدی(f: آهنگ، path: رشته): منطقی
آهنگ را در پرونده میدی می‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Write.salam

نت‌ها Notes

تابع نت‌ها(f: آهنگ): وکتور<synth.Note>
هر نت آهنگ به شکل نت صداساز، با آغاز و درازی‌اش از پیش به ثانیه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Read.salam

ساختن Render

تابع ساختن(f: آهنگ، rate: صحیح، channels: صحیح): audio.Clip
یک آهنگ کامل را از راه صدا.صداساز به قطعه می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Read.salam

نام برنامه ProgramName

تابع نام برنامه(program: صحیح): رشته
نام جنرال میدی یک شماره ساز، یا رشته‌ای خالی برای شماره‌ای که این بسته نامی برایش ندارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: midi-Read.salam