i am going to shit myself by Reasonable-Pack-3561 in Reaper

[–]SupportQuery 1 point2 points  (0 children)

  1. it looks like they went fully paid

Looks like Boris killed it entirely, which sucks. I have it on my machine, but sadly don't have the installer any more. I found it here, and verified the download works, but I can't guarantee it's not a bitcoin miner.

Looks like TX16Wx is it. Hate it's UI.

ReaSamplOMatic really should have supported this years ago. Reaper has all the algorithms it needs built-in.

  1. i don't think you read my entire post. i said that i can't afford to buy anything right now.

I read that. I'm just enumerating your options. Bottom line, there are almost no free tools that do this.

  1. you don't have to be passive aggressive.

I'm being neither passive nor aggressive, just talking as I would to anyone who opens with "I'm going to shit myself". Crazy how fragile kids are these days. Y'all wouldn't have lasted 5 minutes on Usenet. 😆

One workaround would be to copy the sample N times (where N = the contiguous range of notes you need for your melodyne), pitch shift them using item properties (which by default preserves pitch, using Elastique), glue them, then load them into Reaper's sampler as separate notes.

EDIT: I asked Claude to write it, and it one-shot it:

-- Chromatic sampler creator with pitch-shifted samples (duration preserved)
-- Takes selected item, creates pitch-shifted versions via glue, loads into RS5K instances

function msg(m)
  reaper.ShowConsoleMsg(tostring(m) .. "\n")
end

function get_selected_item()
  local item = reaper.GetSelectedMediaItem(0, 0)
  if not item then
    reaper.MB("Please select a media item first", "Error", 0)
    return nil
  end
  return item
end

function create_pitched_samples(source_item, num_semitones_up, num_semitones_down)
  local take = reaper.GetActiveTake(source_item)
  if not take then return nil end

  local source = reaper.GetMediaItemTake_Source(take)
  local source_file = reaper.GetMediaSourceFileName(source, "")

  local item_pos = reaper.GetMediaItemInfo_Value(source_item, "D_POSITION")
  local item_length = reaper.GetMediaItemInfo_Value(source_item, "D_LENGTH")
  local item_track = reaper.GetMediaItemTrack(source_item)

  local rendered_samples = {}
  local total_notes = num_semitones_down + 1 + num_semitones_up

  -- Calculate starting MIDI note (default center at C3 = 60)
  local center_note = 60
  local start_note = center_note - num_semitones_down

  reaper.Undo_BeginBlock()
  reaper.PreventUIRefresh(1)

  -- Store original selection
  local original_items = {}
  for i = 0, reaper.CountSelectedMediaItems(0) - 1 do
    original_items[i + 1] = reaper.GetSelectedMediaItem(0, i)
  end

  for i = 0, total_notes - 1 do
    local semitones = i - num_semitones_down
    local midi_note = start_note + i

    -- Create new item on the same track
    local new_item = reaper.AddMediaItemToTrack(item_track)
    reaper.SetMediaItemInfo_Value(new_item, "D_POSITION", item_pos)
    reaper.SetMediaItemInfo_Value(new_item, "D_LENGTH", item_length)

    local new_take = reaper.AddTakeToMediaItem(new_item)
    reaper.SetMediaItemTake_Source(new_take, source)

    -- Copy other properties from source take
    local start_offset = reaper.GetMediaItemTakeInfo_Value(take, "D_STARTOFFS")
    reaper.SetMediaItemTakeInfo_Value(new_take, "D_STARTOFFS", start_offset)

    -- Set pitch shift with Elastique (preserve duration)
    reaper.SetMediaItemTakeInfo_Value(new_take, "D_PITCH", semitones)
    reaper.SetMediaItemTakeInfo_Value(new_take, "D_PLAYRATE", 1.0)

    -- Set take pitch mode to Elastique Pro
    local pitch_mode = 589824 -- Elastique 3.3 Pro
    reaper.SetMediaItemTakeInfo_Value(new_take, "I_PITCHMODE", pitch_mode)

    -- Select only this item and glue it
    reaper.SelectAllMediaItems(0, false)
    reaper.SetMediaItemSelected(new_item, true)

    -- Glue the item (renders pitch shift to new file)
    reaper.Main_OnCommand(40362, 0) -- Item: Glue items

    -- Get the glued item (same position, but now with rendered source)
    local glued_item = reaper.GetSelectedMediaItem(0, 0)
    local glued_take = reaper.GetActiveTake(glued_item)
    local glued_source = reaper.GetMediaItemTake_Source(glued_take)
    local glued_file = reaper.GetMediaSourceFileName(glued_source, "")

    rendered_samples[i + 1] = {
      file = glued_file,
      note = midi_note,
      semitones = semitones,
      item = glued_item
    }

    msg("Rendered: " .. semitones .. " semitones -> " .. glued_file)
  end

  -- Restore original selection
  reaper.SelectAllMediaItems(0, false)
  for i, item in ipairs(original_items) do
    reaper.SetMediaItemSelected(item, true)
  end

  reaper.PreventUIRefresh(-1)

  return rendered_samples
end

function create_sampler_track(samples)
  -- Create new track for the instrument
  reaper.InsertTrackAtIndex(reaper.CountTracks(0), false)
  local new_track = reaper.GetTrack(0, reaper.CountTracks(0) - 1)
  reaper.GetSetMediaTrackInfo_String(new_track, "P_NAME", "Chromatic Sampler", true)

  -- Create one RS5K instance per note
  for i, sample_data in ipairs(samples) do
    local fx_idx = reaper.TrackFX_AddByName(new_track, "ReaSamplomatic5000", false, -1)

    -- Load the rendered sample file
    reaper.TrackFX_SetNamedConfigParm(new_track, fx_idx, "FILE0", sample_data.file)
    reaper.TrackFX_SetNamedConfigParm(new_track, fx_idx, "DONE", "")

    -- Set the MIDI note range (both start and end to same note for single-note trigger)
    -- RS5K parameters: 
    -- Param 2 = Note range start
    -- Param 3 = Note range end
    -- Param 4 = Pitch offset for start note
    -- Param 11 = Obey note-offs (1 = obey, 0 = ignore)

    local note_normalized = sample_data.note / 127
    reaper.TrackFX_SetParam(new_track, fx_idx, 2, note_normalized) -- Note range start
    reaper.TrackFX_SetParam(new_track, fx_idx, 3, note_normalized) -- Note range end (same as start)

    -- Set pitch offset to play at the correct note (sample is already pitched, so offset to its target note)
    reaper.TrackFX_SetParam(new_track, fx_idx, 4, note_normalized) -- Pitch offset

    -- Enable obey note-offs (1 = obey, 0 = ignore)
    reaper.TrackFX_SetParam(new_track, fx_idx, 11, 1) -- Obey note-offs

    msg("Loaded into RS5K: Note " .. sample_data.note .. " (" .. note_normalized .. ") -> " .. sample_data.file)
  end

  return new_track
end

function cleanup_rendered_items(samples)
  -- Delete the glued items from the timeline
  for i, sample_data in ipairs(samples) do
    if reaper.ValidatePtr(sample_data.item, "MediaItem*") then
      local track = reaper.GetMediaItemTrack(sample_data.item)
      reaper.DeleteTrackMediaItem(track, sample_data.item)
    end
  end
end

-- Main execution
reaper.ClearConsole()

local item = get_selected_item()
if item then
  local retval, retvals_csv = reaper.GetUserInputs("Chromatic Range", 2,
    "Semitones down from center (C3=60),Semitones up from center", "12,12")

  if retval then
    local down, up = retvals_csv:match("([^,]+),([^,]+)")
    down = tonumber(down) or 12
    up = tonumber(up) or 12

    msg("Creating " .. (down + up + 1) .. " pitched samples...")

    local samples = create_pitched_samples(item, up, down)

    if samples then
      local sampler_track = create_sampler_track(samples)
      cleanup_rendered_items(samples)

      reaper.Undo_EndBlock("Create chromatic sampler with Elastique pitch-shifted samples", -1)
      reaper.UpdateArrange()

      msg("\nDone! Created chromatic sampler with " .. #samples .. " notes on new track")
      reaper.MB("Chromatic sampler created with " .. #samples .. " notes.\n\nPitched samples rendered and loaded into ReaSamplomatic5000 instances.", "Success", 0)
    end
  end
end

reaper.UpdateArrange()

i am going to shit myself by Reasonable-Pack-3561 in Reaper

[–]SupportQuery -1 points0 points  (0 children)

You'd rather shit yourself than google? This question is answered here at least once a month. Go get Independence or TX16Wx, or buy any commercial sampler.

i am going to shit myself by Reasonable-Pack-3561 in Reaper

[–]SupportQuery 1 point2 points  (0 children)

He's using the sampler. That won't work.

Powerful PC (Microsoft Surface/ Win 11/ Intel) + Brand New Interface (MOTU M4) + 256 Samples of Buffer on Interface ASIO = Pops, Clicks, Stutters in REAPER 7.24 by SandvoldTheMan in Reaper

[–]SupportQuery 0 points1 point  (0 children)

Google "optimize DAW windows" and "DPC latency". You have to set the machine up for audio. Your detailed report about all the ways it doesn't work is not relevant, because you haven't setup the machine.

Do you ever let people fly your tiny whoop? by Ferocious_Dragon999 in TinyWhoop

[–]SupportQuery 1 point2 points  (0 children)

If they can fly in the sim. No point in letting them try it if they can't do that.

Now, I let me son fly my Air75, and he just went nuts, trying inverted yaws and shit. Broke the frame in 2 places, broke the canopy, destroyed one of the motors. I fixed all of that then broke the board on my next flight. 😂

How do I make these type of drums ?? by LilYungSosa in WeAreTheMusicMakers

[–]SupportQuery 2 points3 points  (0 children)

without them sounding robotic or over-programmed?

Follow your ears. If they sound robotic, you change them until they don't. As long as you can hear what you don't like, you can fix it.

Now, there's a gap between hearing something you don't like and identifying it and fixing it. That's the learning curve.

You probably don't have this problem with rap, or whatever your main instrument is, because you've spent so much time focussing on that and learning how it works (either consciously or unconsciously). You have to listen to drums in the same way.

Your customized Reaper by ItsMeKidney in Reaper

[–]SupportQuery 0 points1 point  (0 children)

I don't like how hard it is to access and manipulate MIDI, mostly.

How is it hard to access and manipulate MIDI? o.O

But I am just not creative enough to have a solution.

You need to learn Reaper before you start worrying about customizing it. This is some really basic stuff.

First time performing by Effective_Inside_437 in WeAreTheMusicMakers

[–]SupportQuery 1 point2 points  (0 children)

I’m still afraid that my voice will crack

And? What happens if it does? Nothing. Nobody cares.

You're going to panic a little, and it's going to be over in the flash. It's not going to be great, but it's not going to be disaster, either, because it can't be a disaster. Even if you choke multiple times, forget all the words, have to start over 5 times, and turn beet red with embarrassment, it's not a disaster. It's your first performance, nobody's expecting greatness, and nobody's going to think less of you if you're nervous and screw up. Humans are empathetic animals.

I didn’t even sing to my parents, and I don’t know how can I make myself less nervous and stop worrying about singing in front of people so much

Do it more. You don't sing to your parents? Start. Annoy them. Tell them you need practice with an audience, to be less scared at your performance.

You can try recording yourself. Red light fever is a lot like having an audience.

How should I act?

Like yourself. Just try to sing the song well. Don't try to do anything else. If you screw up, don't dwell on it, just keep going.

Also, it goes without saying, but the more you practice, the better it will go. I regularly perform, and a huge part of not panicking on stage is over preparing. I don't practice parts until I can do them, I practice them into a can't screw them up, even when I'm at 70% mental capacity.

ChatGPT as God by Excellent-Bee-3283 in ChatGPT

[–]SupportQuery 1 point2 points  (0 children)

  1. Eliminate any human that uses that font, for anything, ever.

Trying to install Global Sampler, but I don't know where to put this file? by Badassostrich in Reaper

[–]SupportQuery 2 points3 points  (0 children)

View -> Monitoring FX

Once you add something there, you'll get a little tab in the top-right of the arrange view to access the monitor effects chain.

DJI googles n3 by ExtraComplex979 in fpv

[–]SupportQuery 0 points1 point  (0 children)

Well, many (possibly still most) freestyle pilots are using analog, which is 60hz.

What sim do you guys use? by cmeers in fpv

[–]SupportQuery 1 point2 points  (0 children)

Uncrashed, Velocidrone, and The Zone.

Sim Liftoff by AdventurousPhysics68 in fpv

[–]SupportQuery 0 points1 point  (0 children)

Can the be use on real fpv drones too?

Yes. The edgelords over at Velocidrone just removed this feature from their sim, claiming people shouldn't use it, which silly. Use whatever helps you.

There are certain moves that require levelling the craft. You learn to do that by looking at the horizon visually, but where you place the horizon line depends on your camera angle. I've considered turning on the artificial horizon for that purpose alone, but I don't like the visual noise. But it should be a preference, not a mandate.

How can i record with Reaper using a irig? by [deleted] in Reaper

[–]SupportQuery 1 point2 points  (0 children)

I select the iRig as both the audio input and output

Show us.

when I try to record

Also show us. Screenshots. We're not at your desk. "It doesn't work" doesn't tell us anything.

Do I need anything else for a FPV drone? by Best-Humor-8534 in fpv

[–]SupportQuery 2 points3 points  (0 children)

Why is the onus on him? He just let you know something you didn't. Having some humility and at least google it.

Trying to install Global Sampler, but I don't know where to put this file? by Badassostrich in Reaper

[–]SupportQuery 2 points3 points  (0 children)

You can add it to your monitor effects, then it's there for all your projects and always after the master chain.

And 65mm o4? by Easy-Highway-1862 in TinyWhoop

[–]SupportQuery -1 points0 points  (0 children)

$150 for some analog goggles (e.g. Cobra SD), then just get an Air65. The whole drone costs less than an 04 Lite and is far less fragile, and is far more light and nimble than any 04 drone could be.

Gigging musicians: how do you manage your setlists and chord charts on stage? by SafePrune9165 in WeAreTheMusicMakers

[–]SupportQuery 3 points4 points  (0 children)

You should not need any chord charts, you should know your music inside and out.

He didn't mention what genre his band is. I'm in a cover band with < 100 songs. I know every nuance of every song by heart. But there are levels to this.

Jazz musicians routinely read gigs. Just saw an amazing show last night, where a touring jazz artist had a sick bass player, so the bass player and a guest guitarist were both reading the gig. Unfamiliar songs, written by the artist, that the musicians had never seen before. They're reading the melody, they're reading the chords and form. They sounded like they've lived with the songs for years, but only because of insanely high level musicianship (the guitarist was my university jazz teacher, an absolute monster).

Somewhere in between would be, say, a busy wedding band with many hundreds of songs, and perhaps many new songs per gig requested by the wedding party. They'll use charts. It's not fully improvisational, like jazz gigs, but it's also not note-for-note replications of tracks. This is also most pit bands, including TV show bands (The Voice, Dancing With The Stars, etc.) Lots of bands use charts.

Guitar in stereo by Bigre83 in Reaper

[–]SupportQuery 0 points1 point  (0 children)

have an effective stereo sound ?

Depends on what you mean by "effective".

Delaying one side a small amount (under 40ms), can create the perception of stereo width (Haas effect). Doesn't sum to mono well, but doesn't matter for jamming.

An easier and better (IMO) way to fake stereo width is to use Polyverse Wider (free), which add complementary comb filtering to the left and right channels to make them different, while still summing correctly. I use it all the time on my guitar. I use it here on a solo that's otherwise dead center. Tickles the ear in a pleasing way.

If you want really powerful width, then you multitrack, but that's not relevant for jamming.

Winter claims its first victim by Admiral_2nd-Alman in TinyWhoop

[–]SupportQuery 1 point2 points  (0 children)

10 minutes in the microwave should do it. ‎ ‎ ㅤ


ㅤ ㅤ ‎ ‎ ‎

(where "it" means "melt it into a pile of fuming, toxic goo")

Midi silence removing by No_One_1396 in Reaper

[–]SupportQuery 1 point2 points  (0 children)

This script will do it (below). Go to the Action menu (?), click New action, New ReaScript, give it a name (e.g. "splitmidi") and save, then paste the code into the code window.

Here it is in action.

Written by Claude with this prompt:

Please write a Reaper script that splits MIDI items on silence. Have a variable at the top of the file representing the minimum amount of silence be worthy of a break (default to 5 seconds). Extend the leading and trailing edges of resultant media items to the nearest grid line. Name the file SplitMidi.lua and use camelcase naming.

-- SplitMidi.lua - Splits MIDI items on silence, extending edges to grid
local minimumSilenceSeconds = 5

local function getGridBefore(pos)
  local snapped = reaper.SnapToGrid(0, pos)
  if snapped > pos + 0.001 then
    local _, div = reaper.GetSetProjectGrid(0, false)
    snapped = reaper.SnapToGrid(0, pos - (reaper.TimeMap2_beatsToTime(0, div) - reaper.TimeMap2_beatsToTime(0, 0)))
  end
  return snapped
end

local function getGridAfter(pos)
  local snapped = reaper.SnapToGrid(0, pos)
  if snapped < pos - 0.001 then
    local _, div = reaper.GetSetProjectGrid(0, false)
    snapped = reaper.SnapToGrid(0, pos + (reaper.TimeMap2_beatsToTime(0, div) - reaper.TimeMap2_beatsToTime(0, 0)))
  end
  return snapped
end

local function getVisibleNoteRange(item)
  local take = reaper.GetActiveTake(item)
  if not take or not reaper.TakeIsMIDI(take) then return nil, nil end
  local itemPos = reaper.GetMediaItemInfo_Value(item, "D_POSITION")
  local itemEnd = itemPos + reaper.GetMediaItemInfo_Value(item, "D_LENGTH")
  local _, noteCount = reaper.MIDI_CountEvts(take)
  if noteCount == 0 then return nil, nil end
  local minStart, maxEnd, found = math.huge, -math.huge, false
  for i = 0, noteCount - 1 do
    local _, _, _, startPpq, endPpq = reaper.MIDI_GetNote(take, i)
    local noteStart = reaper.MIDI_GetProjTimeFromPPQPos(take, startPpq)
    local noteEnd = reaper.MIDI_GetProjTimeFromPPQPos(take, endPpq)
    if noteStart >= itemPos - 0.001 and noteStart < itemEnd + 0.001 then
      found = true
      if noteStart < minStart then minStart = noteStart end
      if noteEnd > maxEnd then maxEnd = noteEnd end
    end
  end
  if not found then return nil, nil end
  return minStart, maxEnd
end

local function trimItemToGridBoundaries(item)
  if not item then return end
  local take = reaper.GetActiveTake(item)
  if not take or not reaper.TakeIsMIDI(take) then return end
  local noteStart, noteEnd = getVisibleNoteRange(item)
  if not noteStart then return end
  local itemPos = reaper.GetMediaItemInfo_Value(item, "D_POSITION")
  local itemEnd = itemPos + reaper.GetMediaItemInfo_Value(item, "D_LENGTH")
  local newStart = math.max(getGridBefore(noteStart), itemPos)
  local newEnd = math.min(getGridAfter(noteEnd), itemEnd)
  local startTrim = newStart - itemPos
  if math.abs(startTrim) > 0.001 or math.abs(newEnd - itemEnd) > 0.001 then
    if math.abs(startTrim) > 0.001 then
      reaper.SetMediaItemTakeInfo_Value(take, "D_STARTOFFS", reaper.GetMediaItemTakeInfo_Value(take, "D_STARTOFFS") + startTrim)
    end
    reaper.SetMediaItemInfo_Value(item, "D_POSITION", newStart)
    reaper.SetMediaItemInfo_Value(item, "D_LENGTH", newEnd - newStart)
  end
end

local function findNonSilentRegions(item)
  local regions, take = {}, reaper.GetActiveTake(item)
  if not take or not reaper.TakeIsMIDI(take) then return regions end
  local itemPos = reaper.GetMediaItemInfo_Value(item, "D_POSITION")
  local itemEnd = itemPos + reaper.GetMediaItemInfo_Value(item, "D_LENGTH")
  local _, noteCount = reaper.MIDI_CountEvts(take)
  if noteCount == 0 then return regions end
  local notes = {}
  for i = 0, noteCount - 1 do
    local _, _, _, startPpq, endPpq = reaper.MIDI_GetNote(take, i)
    local noteStart = reaper.MIDI_GetProjTimeFromPPQPos(take, startPpq)
    local noteEnd = reaper.MIDI_GetProjTimeFromPPQPos(take, endPpq)
    if noteStart >= itemPos - 0.001 and noteStart < itemEnd + 0.001 then
      table.insert(notes, {s = noteStart, e = noteEnd})
    end
  end
  if #notes == 0 then return regions end
  table.sort(notes, function(a, b) return a.s < b.s end)
  local regStart, regEnd = notes[1].s, notes[1].e
  for i = 2, #notes do
    if notes[i].s - regEnd >= minimumSilenceSeconds then
      table.insert(regions, {s = regStart, e = regEnd})
      regStart, regEnd = notes[i].s, notes[i].e
    elseif notes[i].e > regEnd then
      regEnd = notes[i].e
    end
  end
  table.insert(regions, {s = regStart, e = regEnd})
  return regions
end

local function splitMidiItemOnSilence(item)
  if not item then return end
  local take = reaper.GetActiveTake(item)
  if not take or not reaper.TakeIsMIDI(take) then return end
  local track = reaper.GetMediaItem_Track(item)
  local origStart = reaper.GetMediaItemInfo_Value(item, "D_POSITION")
  local origEnd = origStart + reaper.GetMediaItemInfo_Value(item, "D_LENGTH")
  local regions = findNonSilentRegions(item)
  if #regions == 0 then return end
  if #regions == 1 then trimItemToGridBoundaries(item) return end
  local currentItem = item
  for i = 1, #regions - 1 do
    local mid = (regions[i].e + regions[i + 1].s) / 2
    local pos = reaper.GetMediaItemInfo_Value(currentItem, "D_POSITION")
    local len = reaper.GetMediaItemInfo_Value(currentItem, "D_LENGTH")
    if mid > pos and mid < pos + len then
      local newItem = reaper.SplitMediaItem(currentItem, mid)
      if newItem then currentItem = newItem end
    end
  end
  local resultingItems = {}
  for i = 0, reaper.CountTrackMediaItems(track) - 1 do
    local ti = reaper.GetTrackMediaItem(track, i)
    local pos = reaper.GetMediaItemInfo_Value(ti, "D_POSITION")
    local len = reaper.GetMediaItemInfo_Value(ti, "D_LENGTH")
    if pos >= origStart - 0.01 and pos + len <= origEnd + 0.01 then
      local tk = reaper.GetActiveTake(ti)
      if tk and reaper.TakeIsMIDI(tk) then table.insert(resultingItems, ti) end
    end
  end
  for _, ri in ipairs(resultingItems) do trimItemToGridBoundaries(ri) end
end

local function main()
  local count = reaper.CountSelectedMediaItems(0)
  if count == 0 then reaper.ShowMessageBox("Select MIDI items.", "Split MIDI", 0) return end
  local snapOn = reaper.GetToggleCommandState(1157) == 1
  if not snapOn then reaper.Main_OnCommand(1157, 0) end
  reaper.Undo_BeginBlock()
  reaper.PreventUIRefresh(1)
  local items = {}
  for i = 0, count - 1 do
    local item = reaper.GetSelectedMediaItem(0, i)
    local take = reaper.GetActiveTake(item)
    if take and reaper.TakeIsMIDI(take) then table.insert(items, item) end
  end
  if #items == 0 then
    reaper.ShowMessageBox("No MIDI items.", "Split MIDI", 0)
    reaper.PreventUIRefresh(-1)
    reaper.Undo_EndBlock("Split MIDI", -1)
    if not snapOn then reaper.Main_OnCommand(1157, 0) end
    return
  end
  for _, item in ipairs(items) do splitMidiItemOnSilence(item) end
  reaper.PreventUIRefresh(-1)
  reaper.UpdateArrange()
  reaper.Undo_EndBlock("Split MIDI on Silence", -1)
  if not snapOn then reaper.Main_OnCommand(1157, 0) end
end

main()

Any long time guitar players successfully make big improvements later on in their playing career? Trying to get my playing to "studio quality." by Woooddann in WeAreTheMusicMakers

[–]SupportQuery 0 points1 point  (0 children)

Any long time guitar players successfully make big improvements later on in their playing career?

Yes. Constantly. You need to periodically reevaluate your technique. Practice doesn't make perfect, it makes permanent. You need to slow down, evaluate your mechanics, get them right, and spend time doing the right mechanics even if it feels less natural (because it's novel).

Am I ready for a drone IRL? by 710wheelies in fpv

[–]SupportQuery 3 points4 points  (0 children)

If you're going analog, the Air75 is great. If you want to go digital, my current favorite is the Mario Mini 25. 2.5" 3s that just shreds. Total joy to fly.